W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
你正在試著用正則表達(dá)式匹配某個文本模式,但是它找到的是模式的最長可能匹配。而你想修改它變成查找最短的可能匹配。
這個問題一般出現(xiàn)在需要匹配一對分隔符之間的文本的時候(比如引號包含的字符串)。為了說明清楚,考慮如下的例子:
>>> str_pat = re.compile(r'\"(.*)\"')
>>> text1 = 'Computer says "no."'
>>> str_pat.findall(text1)
['no.']
>>> text2 = 'Computer says "no." Phone says "yes."'
>>> str_pat.findall(text2)
['no." Phone says "yes.']
>>>
在這個例子中,模式 r'\"(.*)\"'
的意圖是匹配被雙引號包含的文本。但是在正則表達(dá)式中*操作符是貪婪的,因此匹配操作會查找最長的可能匹配。于是在第二個例子中搜索 text2
的時候返回結(jié)果并不是我們想要的。
為了修正這個問題,可以在模式中的*操作符后面加上?修飾符,就像這樣:
>>> str_pat = re.compile(r'\"(.*?)\"')
>>> str_pat.findall(text2)
['no.', 'yes.']
>>>
這樣就使得匹配變成非貪婪模式,從而得到最短的匹配,也就是我們想要的結(jié)果。
這一節(jié)展示了在寫包含點(.)字符的正則表達(dá)式的時候遇到的一些常見問題。在一個模式字符串中,點(.)匹配除了換行外的任何字符。然而,如果你將點(.)號放在開始與結(jié)束符(比如引號)之間的時候,那么匹配操作會查找符合模式的最長可能匹配。這樣通常會導(dǎo)致很多中間的被開始與結(jié)束符包含的文本被忽略掉,并最終被包含在匹配結(jié)果字符串中返回。通過在*或者+這樣的操作符后面添加一個?可以強制匹配算法改成尋找最短的可能匹配。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: