找到字符串的完全匹配

时间:2013-05-27 02:30:41

标签: python regex string match

我使用以下函数来查找字符串中单词的完全匹配。

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会将整个单词与连字符和其他标点符号相匹配?

2 个答案:

答案 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

来自Regular Expression HOWTO

\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将不会成功。