查找字符串的完全匹配项

2024-05-21 01:13:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

但我得到了“award”和“award-wing”两个词的精确匹配,而它只应该是以下字符串的award-wing。

str1 = "award-winning blueberries"
word1 = "award"
word2 = "award-winning"

我怎样才能让re.findall用连字符和其他标点符号来匹配整个单词呢?


Tags: 函数字符串rereturndefmatchresult单词
2条回答

给自己定个字眼:

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是非常非常规的外壳。就称之为完全匹配。

初始方法的问题是'\\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-wining中找到award,但在awards中找不到。

根据你搜索的短语,我也会考虑使用re.findall,而不是Elazar建议的re.match。在您的示例中,re.match可以工作,但是如果您要查找的单词嵌套在字符串开头以外的任何地方,re.match将不会成功。

相关问题 更多 >