如何匹配 python 正则表达式中字符串列表中的任何字符串?

新手上路,请多包涵

可以说我有一个字符串列表,

 string_lst = ['fun', 'dum', 'sun', 'gum']

我想制作一个正则表达式,在其中的某个点,我可以匹配组中该列表中的任何字符串,例如:

 import re
template = re.compile(r".*(elem for elem in string_lst).*")
template.match("I love to have fun.")

这样做的正确方法是什么?或者是否必须制作多个正则表达式并将它们全部分别匹配到字符串?

原文由 Josh Weinstein 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 764
2 个回答

加入管道字符 | 的列表,它代表正则表达式中的不同选项。

 string_lst = ['fun', 'dum', 'sun', 'gum']
x="I love to have fun."

print re.findall(r"(?=("+'|'.join(string_lst)+r"))", x)

输出: ['fun']

您不能使用 match 因为它将从一开始就匹配。使用 search 你只会得到第一场比赛。所以使用 findall 代替。

如果您有重叠匹配而不是从同一点开始,也可以使用 前瞻

原文由 vks 发布,翻译遵循 CC BY-SA 4.0 许可协议

regex 模块 有 _命名列表_(实际上是集合):

 #!/usr/bin/env python
import regex as re # $ pip install regex

p = re.compile(r"\L<words>", words=['fun', 'dum', 'sun', 'gum'])
if p.search("I love to have fun."):
    print('matched')

这里 words 只是一个名字,你可以使用任何你喜欢的名字。

.search() 方法用于代替 .* 在命名列表之前/之后。

使用 stdlib 的 re 模块模拟命名列表:

 #!/usr/bin/env python
import re

words = ['fun', 'dum', 'sun', 'gum']
longest_first = sorted(words, key=len, reverse=True)
p = re.compile(r'(?:{})'.format('|'.join(map(re.escape, longest_first))))
if p.search("I love to have fun."):
    print('matched')

re.escape() 用于转义正则表达式元字符,例如 .*? 在单个单词中(以逐字匹配单词)。

sorted() 模拟 regex 行为,它把最长的单词放在备选方案中的第一位,比较:

 >>> import re
>>> re.findall("(funny|fun)", "it is funny")
['funny']
>>> re.findall("(fun|funny)", "it is funny")
['fun']
>>> import regex
>>> regex.findall(r"\L<words>", "it is funny", words=['fun', 'funny'])
['funny']
>>> regex.findall(r"\L<words>", "it is funny", words=['funny', 'fun'])
['funny']

原文由 jfs 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题