假设我有一个字符串列表,
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.")
这样做的正确方法是什么?或者,是否必须制作多个正则表达式并将它们全部分别匹配到字符串?
答案 0 :(得分:19)
string_lst = ['fun', 'dum', 'sun', 'gum']
x="I love to have fun."
print re.findall(r"(?=("+'|'.join(string_lst)+r"))",x)
您无法使用match
,因为它将从start.Use findall
开始匹配。
输出:['fun']
使用search
您将只获得第一个匹配。所以请改用findall
。
如果重叠匹配不是从同一点开始,也请使用lookahead
。
答案 1 :(得分:11)
regex
module有命名列表(实际设置):
#!/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&#39; s 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']
答案 2 :(得分:3)
除了正则表达式,你可以使用列表理解,希望它不是主题。
import re
def match(input_string, string_list):
words = re.findall(r'\w+', input_string)
return [word for word in words if word in string_list]
>>> string_lst = ['fun', 'dum', 'sun', 'gum']
>>> match("I love to have fun.", string_lst)
['fun']
答案 3 :(得分:2)
与@vks答复一致-我认为这实际上完成了一项完成任务。
finds = re.findall(r"(?=(\b" + '\\b|\\b'.join(string_lst) + r"\b))", x)
添加单词边界即可完成任务!
答案 4 :(得分:1)
在组合成正则表达式之前,你应该确保正确地转义字符串
>>> import re
>>> string_lst = ['fun', 'dum', 'sun', 'gum']
>>> x = "I love to have fun."
>>> regex = re.compile("(?=(" + "|".join(map(re.escape, string_lst)) + "))")
>>> re.findall(regex, x)
['fun']