我需要在字符串中搜索多个单词。
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循环的原因。
答案 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
。