亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

查找與字符串完全匹配的字符串

查找與字符串完全匹配的字符串

滄海一幻覺 2021-03-02 17:13:07
我使用以下函數來查找字符串中單詞的完全匹配。def exact_Match(str1, word):    result = re.findall('\\b'+word+'\\b', str1, flags=re.IGNORECASE)    if len(result)>0:        return True    else:        return Falseexact_Match(str1, word)但是當“ award”和“ award-winning”這兩個詞僅應在以下字符串中獲獎時,我得到了一個完全匹配的詞。str1 = "award-winning blueberries"word1 = "award"word2 = "award-winning"我如何才能使re.findall將整個單詞與連字符和其他標點符號匹配?
查看完整描述

2 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超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是相當非常規的外殼。只需將其稱為精確匹配即可。


查看完整回答
反對 回復 2021-03-27
?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

您的初始方法的問題在于,'\\b'它并不表示您要尋找的零寬度斷言搜索。(如果這樣做的話,我會改用r'\b'反斜杠,因為反斜杠可能會成為正則表達式中真正的麻煩-請參閱此鏈接)

從正則表達式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.matchElazar的建議。在您的示例中re.match可以運行,但是如果您要查找的單詞嵌套在字符串開頭之外的任何位置,re.match則不會成功。


查看完整回答
反對 回復 2021-03-27
  • 2 回答
  • 0 關注
  • 259 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號