- Python進(jìn)階編程:編寫更高效、優(yōu)雅的Python代碼
- 劉宇宙 謝東 劉艷
- 368字
- 2021-04-30 12:39:40
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ù)程序也能工作得很好。
推薦閱讀
- 劍指JVM:虛擬機(jī)實(shí)踐與性能調(diào)優(yōu)
- 編寫高質(zhì)量代碼:改善Python程序的91個(gè)建議
- Mastering Python Scripting for System Administrators
- Mastering OpenCV 4
- 精通Scrapy網(wǎng)絡(luò)爬蟲
- MATLAB實(shí)用教程
- 編程數(shù)學(xué)
- 用戶體驗(yàn)增長(zhǎng):數(shù)字化·智能化·綠色化
- 計(jì)算機(jī)應(yīng)用基礎(chǔ)案例教程
- Vue.js應(yīng)用測(cè)試
- Elasticsearch Essentials
- Emotional Intelligence for IT Professionals
- Magento 2 Beginners Guide
- Practical Predictive Analytics
- Java RESTful Web Service實(shí)戰(zhàn)