1

假设我有一个lst包含成千上万个字符串的列表。还说我有一个字符串列表 strings_to_match,例如:

strings_to_match = ['foo', 'bar', 'hello']

我想在其中找到lst包含所有关于strings_to_match_against order的字符串的字符串。

例如,如果lst

[ 'foo-yes-bar', 'hello foo fine bar', 'abcdf foo,bar, hello?']

那么result应该是'abcdf foo,bar, hello?',因为该字符串包含 中的所有字符串strings_to_match,并且它们以相同的顺序出现。

我有以下内容:

result = [x for x in lst if re.search(my_pattern, x)]

但我不知道如何定义my_pattern使用strings_to_match

4

2 回答 2

2

我不认为正则表达式是必要的:

>>> 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)]

我的帖子虽然是针对你原来的问题。

于 2013-08-07T18:37:08.023 回答
2

更新问题的答案:您可以使用

my_pattern = ".*".join(map(re.escape, strings_to_match))

匹配包含strings_to_match在给定顺序中的任何字符串。

您可以使用列表理解过滤列表,也可以使用filter()

result = filter(re.compile(my_pattern).search, lst)

在这种特殊情况下,使用filter()效率稍高一些。

于 2013-08-07T18:50:03.327 回答