《Python Cookbook 3rd》笔记(2.7):最短匹配模式
最短匹配模式
問(wèn)題
你正在試著用正則表達(dá)式匹配某個(gè)文本模式,但是它找到的是模式的最長(zhǎng)可能匹配。而你想修改它變成查找最短的可能匹配。
解法
這個(gè)問(wèn)題一般出現(xiàn)在需要匹配一對(duì)分隔符之間的文本的時(shí)候 (比如引號(hào)包含的字符串)。為了說(shuō)明清楚,考慮如下的例子:
>>> 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.'] >>>在這個(gè)例子中,模式 r'n"(.*)n"' 的意圖是匹配被雙引號(hào)包含的文本。但是在正則表達(dá)式中 * 操作符是貪婪的,因此匹配操作會(huì)查找最長(zhǎng)的可能匹配。于是在第二個(gè)例子中搜索 text2 的時(shí)候返回結(jié)果并不是我們想要的。
為了修正這個(gè)問(wèn)題,可以在模式中的 * 操作符后面加上? 修飾符,就像這樣:
>>> str_pat = re.compile(r'\"(.*?)\"') >>> str_pat.findall(text2) ['no.', 'yes.'] >>>這樣就使得匹配變成非貪婪模式,從而得到最短的匹配,也就是我們想要的結(jié)果。
討論
本文展示了在寫(xiě)包含點(diǎn) (.) 字符的正則表達(dá)式的時(shí)候遇到的一些常見(jiàn)問(wèn)題。在一個(gè)模式字符串中,點(diǎn) (.) 匹配除了換行外的任何字符。然而,如果你將點(diǎn) (.) 號(hào)放在開(kāi)始與結(jié)束符 (比如引號(hào)) 之間的時(shí)候,那么匹配操作會(huì)查找符合模式的最長(zhǎng)可能匹配。
這樣通常會(huì)導(dǎo)致很多中間的被開(kāi)始與結(jié)束符包含的文本被忽略掉,并最終被包含在匹配結(jié)果字符串中返回。通過(guò)在 * 或者 + 這樣的操作符后面添加一個(gè) ? 可以強(qiáng)制匹配算法改成尋找最短的可能匹配。
總結(jié)
以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(2.7):最短匹配模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: fastText初探
- 下一篇: Python(13)-函数,lambda