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