詳解Python 最短匹配模式
問題
你正在試著用正則表達式匹配某個文本模式,但是它找到的是模式的最長可能匹配。 而你想修改它變成查找最短的可能匹配。
解決方案
這個問題一般出現(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’'(.*)'’ 的意圖是匹配被雙引號包含的文本。 但是在正則表達式中*操作符是貪婪的,因此匹配操作會查找最長的可能匹配。 于是在第二個例子中搜索 text2 的時候返回結(jié)果并不是我們想要的。
為了修正這個問題,可以在模式中的*操作符后面加上?修飾符,就像這樣:
>>> str_pat = re.compile(r’'(.*?)'’)>>> str_pat.findall(text2)[’no.’, ’yes.’]>>>
這樣就使得匹配變成非貪婪模式,從而得到最短的匹配,也就是我們想要的結(jié)果。
討論
這一節(jié)展示了在寫包含點(.)字符的正則表達式的時候遇到的一些常見問題。 在一個模式字符串中,點(.)匹配除了換行外的任何字符。 然而,如果你將點(.)號放在開始與結(jié)束符(比如引號)之間的時候,那么匹配操作會查找符合模式的最長可能匹配。 這樣通常會導致很多中間的被開始與結(jié)束符包含的文本被忽略掉,并最終被包含在匹配結(jié)果字符串中返回。 通過在 * 或者 + 這樣的操作符后面添加一個 ? 可以強制匹配算法改成尋找最短的可能匹配。
以上就是詳解Python 最短匹配模式的詳細內(nèi)容,更多關(guān)于Python 最短匹配模式的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. Android table布局開發(fā)實現(xiàn)簡單計算器2. jQuery 實現(xiàn)DOM元素拖拽交換位置的實例代碼3. 理解PHP5中static和const關(guān)鍵字4. php模擬實現(xiàn)斗地主發(fā)牌5. IntelliJ IDEA安裝插件的方法步驟6. spring acegi security 1.0.0 發(fā)布7. Vue封裝一個TodoList的案例與瀏覽器本地緩存的應(yīng)用實現(xiàn)8. Python random庫使用方法及異常處理方案9. .Net Core使用Coravel實現(xiàn)任務(wù)調(diào)度的完整步驟10. Vuex localStorage的具體使用

網(wǎng)公網(wǎng)安備