Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找与需要从另一个列表中有序包含的正则表达式匹配的字符串的子列表_Python_Regex - Fatal编程技术网

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
if
strings\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
中的字符串实际上是整词,您只查找整词匹配,对吗?