Python 查找与需要从另一个列表中有序包含的正则表达式匹配的字符串的子列表
假设我有一个包含成千上万个字符串的列表Python 查找与需要从另一个列表中有序包含的正则表达式匹配的字符串的子列表,python,regex,Python,Regex,假设我有一个包含成千上万个字符串的列表lst。还可以说我有一个字符串列表 字符串匹配,例如: strings_to_match = ['foo', 'bar', 'hello'] 我想在lst中找到包含strings\u to\u match\u中所有字符串的字符串,这些字符串与的顺序有关 例如,如果lst为 [ 'foo-yes-bar', 'hello foo fine bar', 'abcdf foo,bar, hello?'] 然后,result应该是'abcdf foo,bar,h
lst
。还可以说我有一个字符串列表
字符串匹配
,例如:
strings_to_match = ['foo', 'bar', 'hello']
我想在lst
中找到包含strings\u to\u match\u中所有字符串的字符串,这些字符串与的顺序有关
例如,如果lst
为
[ 'foo-yes-bar', 'hello foo fine bar', 'abcdf foo,bar, hello?']
然后,result
应该是'abcdf foo,bar,hello?
,因为该字符串包含字符串中的所有字符串,并且它们以相同的顺序出现
我有如下几点:
result = [x for x in lst if re.search(my_pattern, x)]
但是我不知道如何使用字符串匹配来定义我的模式
,我认为没有必要使用正则表达式:
>>> lst = [ 'foo-yes-bar', 'hello foo fine bar']
>>> strings_to_match = ['foo', 'bar', 'hello']
>>> [x for x in lst if all(s in x for s in strings_to_match)]
['hello foo fine bar']
>>>
但是,如果您想使用正则表达式,我想这会起作用:
[x for x in lst if all(re.search(s, x) for s in strings_to_match)]
编辑:
哦,既然你想尊重秩序,你可以这样做:
[x for x in lst if re.search(".*".join(map(re.escape, strings_to_match)), x)]
不过,我的帖子是针对你原来的问题写的。我认为没有必要使用正则表达式:
>>> lst = [ 'foo-yes-bar', 'hello foo fine bar']
>>> strings_to_match = ['foo', 'bar', 'hello']
>>> [x for x in lst if all(s in x for s in strings_to_match)]
['hello foo fine bar']
>>>
但是,如果您想使用正则表达式,我想这会起作用:
[x for x in lst if all(re.search(s, x) for s in strings_to_match)]
编辑:
哦,既然你想尊重秩序,你可以这样做:
[x for x in lst if re.search(".*".join(map(re.escape, strings_to_match)), x)]
不过,我的帖子是针对你原来的问题而写的。回答更新后的问题:你可以使用
my_pattern = ".*".join(map(re.escape, strings_to_match))
按给定顺序匹配任何包含字符串的字符串
您可以使用列表理解或使用filter()
筛选列表:
在这种特殊情况下,使用filter()
稍微有效一些。回答更新的问题:您可以使用
my_pattern = ".*".join(map(re.escape, strings_to_match))
按给定顺序匹配任何包含字符串的字符串
您可以使用列表理解或使用filter()
筛选列表:
在这种特殊情况下,使用filter()
稍微有效一些。谢谢。我仍然对一种解决方案感兴趣,它可以构建my\u模式
并使用re.search
(我可能会从它开始构建更复杂的示例)使用all(x中的s表示字符串中的s要匹配)
。str.count()
不能短路,而s中的sub可以。@arshajii-打得好。谢谢@iCodez。我为这一混乱道歉。我更新了帖子,强制该方法仅在字符串按strings\u to\u match
中指定的顺序出现时才包含匹配项。我仍然对一种解决方案感兴趣,它可以构建my\u模式
并使用re.search
(我可能会从它开始构建更复杂的示例)使用all(x中的s表示字符串中的s要匹配)
。str.count()
不能短路,而s中的sub可以。@arshajii-打得好。谢谢@iCodez。我为这一混乱道歉。我已经更新了帖子,强制该方法仅在字符串的显示顺序与strings\u to\u match
ifstrings\u to\u match=[“abcd”,“cdef”]
和lst
包含“abcdef”
中指定的顺序相同时才包含匹配项,您希望该字符串匹配吗?@SvenMarnach它不应该匹配(也就是说,result
应该是空的,如果“abcdef”
是lst
中的唯一条目)你说“没有一个”是什么意思?我只给了lst
一个条目!关键是重叠匹配是否应该计数。@SvenMarnach我的意思是“abcdef”
与字符串中的任何内容都不匹配,因此字符串将无法与结果匹配
包含两个要匹配的字符串,虽然有重叠。因此strings\u to\u match
中的字符串实际上是整词,您只查找整词匹配,对吗?如果strings\u to\u match=[“abcd”,“cdef”]
和lst
包含“abcdef”
,您希望此字符串匹配吗?@SvenMarnach它不应该匹配(即,如果“abcdef”
是lst
中的唯一条目,则结果应为空)您所说的“无一个”是什么意思--我只给了lst
一个条目!关键是重叠的匹配是否应该计数。@SvenMarnach我的意思是“abcdef”
与字符串中的任何内容都不匹配,所以字符串不会到达结果
包含两个要匹配的字符串,但有重叠。因此字符串\u to \u match
中的字符串实际上是整词,您只查找整词匹配,对吗?