我使用以下函数来查找字符串中单词的完全匹配。
def exact_Match(str1, word):
result = re.findall('\\b'+word+'\\b', str1, flags=re.IGNORECASE)
if len(result)>0:
return True
else:
return False
exact_Match(str1, word)
但我得到了两个词的完全匹配"奖励"和#34;获奖"什么时候才能获得以下字符串的奖励。
str1 = "award-winning blueberries"
word1 = "award"
word2 = "award-winning"
我怎样才能得到re.findall会将整个单词与连字符和其他标点符号相匹配?
答案 0 :(得分:6)
制作自己的单词边界:
def exact_Match(phrase, word):
b = r'(\s|^|$)'
res = re.match(b + word + b, phrase, flags=re.IGNORECASE)
return bool(res)
从这里复制粘贴到我的翻译:
>>> str1 = "award-winning blueberries"
>>> word1 = "award"
>>> word2 = "award-winning"
>>> exact_Match(str1, word1)
False
>>> exact_Match(str1, word2)
True
实际上,bool
的投射是不必要的,根本没有帮助。没有它,功能会更好:
def exact_Match(phrase, word):
b = r'(\s|^|$)'
return re.match(b + word + b, phrase, flags=re.IGNORECASE)
注意:exact_Match
非常传统。只需将其命名为exact_match。
答案 1 :(得分:1)
初始方法的问题是'\\b'
不表示您要查找的零宽度断言搜索。 (如果确实如此,我会使用r'\b'
代替,因为反斜杠可能会成为正则表达式的真正麻烦 - see this link)
\b
Word boundary. This is a zero-width assertion that matches only at the beginning or end of a word. A word is defined as a sequence of alphanumeric characters, so the end of a word is indicated by whitespace or a non-alphanumeric character.
由于-
是非字母数字字符,因此您的findall正则表达式会在award
中找到award-wining
,但不会在awards
中找到。
根据您搜索到的词组,我还会考虑使用re.findall
代替re.match
,如Elazar所建议的那样。在您的示例中re.match
有效,但如果您要查找的单词嵌套在字符串开头之外的任何位置,则re.match
将不会成功。