2013-05-27 176 views
3

我使用以下函數來查找字符串中單詞的精確匹配。找到字符串的完全匹配

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) 

,但我得到了兩個詞「獎」,「獲獎」時,它僅應獲獎以下字符串完全匹配。

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

我怎樣才能得到它,使re.findall匹配連字符和其他標點整個單詞?

回答

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即可。

+0

感謝您的評論。但是,它似乎並不奏效。我把代碼放進去,並且它在所有情況下都返回None。 – lost9123193

+0

@ lost9123193你可能沒有複製代碼,或做了一些修改。它適用於我,我從這裏複製它。 – Elazar

1

您的初始方法的問題是,'\\b'不表示您要查找的零寬度斷言搜索。 (如果它這樣做,我會用r'\b'而不是因爲反斜槓可以成爲正則表達式中一個真正的麻煩 - see this link

Regular Expression HOWTO

\b

因爲-是非字母數字字符,您的findall正則表達式將在award-wining中找到award,但在awards中找不到。

根據您搜索的詞組,我也會考慮使用re.findall而不是Elazar建議的re.match。在你的例子re.match的作品中,但如果你正在尋找的單詞嵌套在字符串的開頭之外的任何地方,re.match將不會成功。