Python正则表达式多重搜索

时间:2011-05-28 18:25:33

标签: python regex

我需要在字符串中搜索多个单词。

import re

words = [{'word':'test1', 'case':False}, {'word':'test2', 'case':False}]

status = "test1 test2"

for w in words:
    if w['case']:
        r = re.compile("\s#?%s" % w['word'], re.IGNORECASE|re.MULTILINE)
    else:
        r = re.compile("\s#?%s" % w['word'], re.MULTILINE)
    if r.search(status):
        print "Found word %s" % w['word']

由于某种原因,这只会找到“test2”而永远不会“test1”。为什么是这样?

我知道我可以使用|划界的搜索,但可能有数百个单词,这就是我使用for循环的原因。

2 个答案:

答案 0 :(得分:7)

test1中的status之前没有空格,而生成的正则表达式需要有空格。

您可以修改测试以匹配空格后或行的开头:

for w in words:
    if w['case']:
        r = re.compile("(^|\s)#?%s" % w['word'], re.IGNORECASE|re.MULTILINE)
    else:
        r = re.compile("(^|\s)#?%s" % w['word'], re.MULTILINE)
    if r.search(status):
        print "Found word %s" % w['word']

答案 1 :(得分:2)

正如Martijn指出的那样,test1之前没有空间。但是当一个单词更长时,你的代码也无法正确处理这种情况。您的代码会将test2blabla视为test2的实例,我不确定这是否是您想要的。

我建议使用字边界正则表达式\b

for w in words:
    if w['case']:
        r = re.compile(r"\b%s\b" % w['word'], re.IGNORECASE|re.MULTILINE)
    else:
        r = re.compile(r"\b%s\b" % w['word'], re.MULTILINE)
    if r.search(status):
        print "Found word %s" % w['word']

编辑:

我应该指出,如果您确实只想 (whitespace)word(whitespace)#word格式,则不能使用\b