官术网_书友最值得收藏!

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))

在上述更改后,匹配變成非貪婪模式,從而得到最短的可能匹配,這也是期望的結果。

這里展示了在寫包含點(.)字符的正則表達式的時候遇到的一些常見問題。在一個模式字符串中,點(.)字符可以匹配除了換行符外的任何字符,但如果將點(.)字符放在開始與結束符(比如:引號)之間,匹配操作會查找符合模式的最長的可能匹配,這樣通常會導致忽視很多中間被開始與結束符包含的文本,最終被包含在匹配結果中返回。

通過在“*”或者“+”這樣的操作符后面添加一個“?”,可以強制匹配算法改成尋找最短的可能匹配。

主站蜘蛛池模板: 陆川县| 康平县| 五华县| 辽宁省| 苍溪县| 镇宁| 金川县| 随州市| 蓬莱市| 军事| 英山县| 高尔夫| 台安县| 绍兴县| 芦溪县| 资兴市| 大英县| 顺昌县| 壤塘县| 峨边| 永康市| 枣强县| 涿鹿县| 积石山| 岑巩县| 读书| 酒泉市| 镇原县| 北京市| 搜索| 凤山市| 宁海县| 丹江口市| 长白| 盘山县| 佛冈县| 和林格尔县| 彭泽县| 都匀市| 永城市| 大关县|