在Python中使用正则表达式搜索字符串

时间:2012-12-25 18:55:59

标签: 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())

结果:

['beer', 'beer', 'german beer']

但预期结果将是:

['beer', 'beer', 'german beer', 'german']

另一种方法可能是:

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

它的工作方式与我想的一样,但我认为这不是最好的方法。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:7)

re.findall无法找到重叠的匹配项。如果要使用正则表达式,则必须创建单独的表达式并在循环中运行它们,如第二个示例所示。

请注意,您的第二个示例也可以缩短为以下内容,不过您是否觉得这更具可读性是一个品味问题:

results = [r for k in keywords for r in re.findall(k, message.lower())] 

您的具体示例不需要使用正则表达式。如果你只是想找到固定的字符串,你应该避免使用正则表达式。

答案 1 :(得分:6)

http://docs.python.org/2/library/re.html

中描述了

re.findall

“返回字符串中所有非重叠的模式匹配...”

非重叠意味着对于“德国啤酒”,它不会找到“德国啤酒”和“德国啤酒”,因为这些匹配是重叠的。

答案 2 :(得分:1)

我的清洁(对我来说)版本为您的最后一个解决方案

results = []
for key in keywords:
    results.extend(re.findall(key, message, re.IGNORECASE))