書名: Python進階編程:編寫更高效、優雅的Python代碼作者名: 劉宇宙 謝東 劉艷本章字數: 518字更新時間: 2021-04-30 12:39:39
2.3.4 最短匹配
用正則表達式匹配某個文本模式是字符串匹配中最為常用的方式。一般,正則表達式找到的是最長的可能匹配,但有時需要的結果是最短的可能匹配。
這個問題一般出現在需要匹配一對分隔符之間的文本的時候(比如引號包含的字符串),相關代碼(shortest_match_exp.py)示例如下:
import re str_pat = re.compile(r'"(.*)"') text_val = 'Show "no." on screen' print(str_pat.findall(text_val)) text_v = 'Computer show "no." Phone show "yes."' print(str_pat.findall(text_v))
執行py文件,輸出結果如下:
['no.'] ['no." Phone show "yes.']
在示例中,模式r'\"(.*)\"'的意圖是匹配雙引號包含的文本。但是在正則表達式中,*操作符是貪婪的,匹配操作會查找最長的可能匹配。所以,在第二個print語句中搜索text_v的時候返回結果并不和期望的一樣。
要修正這個問題,可以在模式中的*操作符后面加上?修飾符,示例如下:
str_pat = re.compile(r'"(.*?)"') print(str_pat.findall(text_v))
在上述更改后,匹配變成非貪婪模式,從而得到最短的可能匹配,這也是期望的結果。
這里展示了在寫包含點(.)字符的正則表達式的時候遇到的一些常見問題。在一個模式字符串中,點(.)字符可以匹配除了換行符外的任何字符,但如果將點(.)字符放在開始與結束符(比如:引號)之間,匹配操作會查找符合模式的最長的可能匹配,這樣通常會導致忽視很多中間被開始與結束符包含的文本,最終被包含在匹配結果中返回。
通過在“*”或者“+”這樣的操作符后面添加一個“?”,可以強制匹配算法改成尋找最短的可能匹配。
推薦閱讀
- Java逍遙游記
- ExtGWT Rich Internet Application Cookbook
- OpenCV 3和Qt5計算機視覺應用開發
- 網絡爬蟲原理與實踐:基于C#語言
- Unity 5.x By Example
- C語言程序設計
- Python圖形化編程(微課版)
- Programming with CodeIgniterMVC
- Hands-On Nuxt.js Web Development
- Arduino計算機視覺編程
- SciPy Recipes
- Angular應用程序開發指南
- Unity Android Game Development by Example Beginner's Guide
- SQL Server實例教程(2008版)
- Learning QGIS(Second Edition)