Adr*_*ian 7 python regex string find
当我尝试使用正则表达式在其他字符串中查找字符串时,它不能按预期工作.这是一个例子:
import re
message = 'I really like beer, but my favourite beer is German beer.'
keywords = ['beer', 'german beer', 'german']
regex = re.compile("|".join(keywords))
regex.findall(message.lower())
Run Code Online (Sandbox Code Playgroud)
结果:
['beer', 'beer', 'german beer']
Run Code Online (Sandbox Code Playgroud)
但预期的结果将是:
['beer', 'beer', 'german beer', 'german']
Run Code Online (Sandbox Code Playgroud)
另一种方法可能是:
results = []
for k in keywords:
regex = re.compile(k)
for r in regex.findall(message.lower()):
results.append(r)
['beer', 'beer', 'beer', 'german beer', 'german']
Run Code Online (Sandbox Code Playgroud)
它的工作方式与我想的一样,但我认为这不是最好的方法.有人能帮助我吗?
re.findall找不到重叠的匹配.如果要使用正则表达式,则必须创建单独的表达式并在循环中运行它们,如第二个示例中所示.
请注意,您的第二个示例也可以缩短为以下内容,但您是否觉得这更具可读性是一个品味问题:
results = [r for k in keywords for r in re.findall(k, message.lower())]
Run Code Online (Sandbox Code Playgroud)
您的具体示例不需要使用正则表达式.如果您只想查找固定字符串,则应避免使用正则表达式.
re.findall在http://docs.python.org/2/library/re.html中描述
"返回字符串中所有非重叠的模式匹配..."
不重叠意味着对于"德国啤酒"它不会找到"德国啤酒"和"德国啤酒",因为这些匹配是重叠的.