【问题标题】:finding an exact match for string找到字符串的完全匹配
【发布时间】:2013-05-21 20:44:55
【问题描述】:

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

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-winning”这两个词的完全匹配,而它只应该为以下字符串获奖。

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

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

【问题讨论】:

    标签: python regex string match


    【解决方案1】:

    创建自己的单词边界:

    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吧。

    【讨论】:

    • 感谢您的评论。但是,它似乎不起作用。我把代码放进去,它在所有情况下都返回 None。
    • @lost9123193 您可能没有复制代码,或者进行了一些更改。它对我有用,我从这里复制了它。
    【解决方案2】:

    您的初始方法的问题是 '\\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 将不会成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 2018-07-30
      • 2016-02-12
      相关资源
      最近更新 更多