Python 检查字符串列表A中的任何项是否为字符串列表B中某项的子字符串

Python 检查字符串列表A中的任何项是否为字符串列表B中某项的子字符串,python,string,list,Python,String,List,我试图通过一组匹配器和一组字符串进行排序,以便 matchers=['foo','bar','abc'] 及 strings=['afooa','zbarz','abcabc','purple','foobar'] 我希望能够得到字符串的任何元素,其中匹配器的任何元素都是子字符串,这样 results=['afooa'、'zbarz'、'abcabc'、'foobar'],理想情况下不需要使用嵌套for循环 我环顾四周已经有一段时间了,但这是一个很难用可搜索的术语来描述的问题,所以即使是任何人在

我试图通过一组匹配器和一组字符串进行排序,以便

matchers=['foo','bar','abc']

strings=['afooa','zbarz','abcabc','purple','foobar']

我希望能够得到
字符串的任何元素,其中
匹配器的任何元素都是子字符串,这样


results=['afooa'、'zbarz'、'abcabc'、'foobar']
,理想情况下不需要使用嵌套for循环

我环顾四周已经有一段时间了,但这是一个很难用可搜索的术语来描述的问题,所以即使是任何人在搜索方面的任何建议都会非常感激

results = [s for s in strings if any(m in s for m in matchers)]
说明:我们迭代
字符串
,如果
匹配器
中的任何元素包含在
字符串
元素中,则添加该元素。

如果不想对循环进行编码,可以使用(RegEx):

>>> import re

>>> regex = re.compile('|'.join(matchers))
这将创建一个
foo | bar | abc
,它将匹配其中任何一个

我们可以使用regex的
搜索
方法以及
过滤器

>>> list(filter(pattern.search, strings))
['afooa', 'zbarz', 'abcabc', 'foobar']
如果不匹配,则返回一个或
None
。因此,我们过滤掉与某个内容匹配的字符串(不管匹配的确切内容是什么)

如果我们使用,它将从字符串开始匹配:

>>> list(filter(pattern.match, strings))
['abcabc', 'foobar']

“理想情况下,不只是求助于嵌套for循环”为什么不?因为它很难看,而且您认为应该有一种更干净、更短的方法(如在嵌套列表理解中),或者性能是一个问题,您正在寻找一种更快的方法,可能是搜索树之类的方法?您可以创建一个正则表达式来匹配
foo | bar | abc