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

2.3.5 多行匹配

在實(shí)際應(yīng)用中,我們有時(shí)需要跨越多行匹配一大塊文本。

這個(gè)問題常出現(xiàn)在用點(diǎn)(.)字符去匹配任意字符的時(shí)候,但事實(shí)是點(diǎn)(.)字符不能匹配換行符,示例如下:


import re

anno_pat = re.compile(r'/\*(.*?)\*/')
text_1 = '/* this is one line annotation */'
text_2 = """/* this is
multi line annotation */
"""

print(anno_pat.findall(text_1))
print(anno_pat.findall(text_2))

對(duì)于以上問題,我們可以通過修改模式字符串,增加對(duì)換行的支持進(jìn)行解決,示例如下:


anno_pat = re.compile(r'/\*((?:.|\n)*?)\*/')
print(anno_pat.findall(text_2))

在示例中,(?:.|\n)指定了一個(gè)非捕獲組。也就是說,它定義了一個(gè)僅僅用來做匹配,而不能通過單獨(dú)捕獲或者編號(hào)的組。

re.compile()函數(shù)接收的一個(gè)標(biāo)志參數(shù)叫re.DOTALL,該參數(shù)可以讓正則表達(dá)式中的點(diǎn)(.)字符匹配包括換行符在內(nèi)的任意字符,示例如下:


anno_pat = re.compile(r'/\*(.*?)\*/', re.DOTALL)
print(anno_pat.findall(text_2))

對(duì)于簡(jiǎn)單的情況,re.DOTALL標(biāo)志參數(shù)可以工作得很好。但若模式非常復(fù)雜或者是為了構(gòu)造字符串令牌而將多個(gè)模式合并起來,這時(shí)使用這個(gè)標(biāo)志參數(shù)就可能出現(xiàn)一些問題。

如果可以選擇,最好自定義正則表達(dá)式模式,這樣不需要額外的標(biāo)志參數(shù)程序也能工作得很好。

主站蜘蛛池模板: 山阳县| 绵竹市| 富裕县| 秦皇岛市| 蒙自县| 镇宁| 峡江县| 兰考县| 许昌县| 湟中县| 晋州市| 道真| 西充县| 荆门市| 中江县| 宜春市| 阜宁县| 屏东市| 自贡市| 望都县| 那坡县| 哈巴河县| 禄丰县| 绥德县| 林甸县| 峨眉山市| 洞头县| 左贡县| 霍邱县| 黄平县| 禹城市| 庆城县| 罗城| 桦甸市| 永嘉县| 阿城市| 渑池县| 确山县| 平山县| 喀喇沁旗| 枣庄市|