第一章 文字 re 正規表示式 利用模式拆分

2021-09-10 10:46:09 字數 1972 閱讀 8490

1.3.11 利用模式拆分

str.split()是分解字串來完成解析的最常用的方法之一。不過,它只支援使用字面量只作為分隔符。有時,如果輸入沒有一致的格式,那麼就需要有乙個正規表示式。例如,很多純文字標記語言都把段落分隔符定義為兩個或多個換行符(\n)。在這種情況下,就不能使用str.split(),因為這個定義中提到了「或多個」。通過findall()標識段落的一種策略是使用類似(.+?)\n的模式。

import re

text =

'''paragraph one

on two lines.

paragraph two.

paragraph three.'''

for num,para in

enumerate

(re.findall(r'(.+?)\n'

,text,flags=re.dotall)):

print

(num,

repr

(para)

)print

()

對於輸入文字末尾的段落,這個模式會失敗,原因在於「paragraph three.」不是輸出的一部分。

執行結果:

可以擴充套件這個模式,指出段落以兩個或多個換行符結束或者以輸入末尾結束,這就能修正這個問題,但也會讓模式變得更為複雜。可以轉而使用re.split()而非re.findall(),這便能自動地處理邊界條件,並保證模式更簡單。

import re

text =

'''paragraph one

on two lines.

paragraph two.

paragraph three.'''

print

('with findall:'

)for num,para in

enumerate

(re.findall(r'(.+?)(\n|$)'

,text,

flags=re.dotall)):

print

(num,

repr

(para)

)print()

print()

print

('with split:'

)for num,para in

enumerate

(re.split(r'\n'

,text)):

print

(num,

repr

(para)

)print

()

split()的模式引數更準確地表述了標記規範。由兩個或多個換行符標記輸入字串中段落之間的分隔點。

執行結果:

可以將表示式包圍在括號裡來定義乙個組,這使得split()的工作更類似於str.partition(),因此它會返回分隔符值以及字串的其他部分。

import re

text =

'''paragraph one

on two lines.

paragraph two.

paragraph three.'''

print

('with split:'

)for num,para in

enumerate

(re.split(r'(\n)'

,text)):

print

(num,

repr

(para)

)print

()

現在輸出包括各個段落,以及分隔這些段落的換行符序列。

執行結果:

第一章 文字 re 正規表示式 多重匹配

1.3.3 多重匹配 到目前為止,示例模式都只是使用search 來查詢字面量文字字串的單個例項。findall 函式會返回輸入中與模式匹配而且不重疊的所有子串。import re text abbaaabbbbaaaaa pattern ab for match in re.findall pat...

第一章 文字 re 正規表示式 限制搜尋

1.3.5 限制搜尋 有些情況下,可以提前知道只需要搜尋整個輸入的乙個子集,在這些情況下,可以告訴re限制搜尋範圍從而進一步約束正規表示式匹配。例如,如果模式必須出現在輸入開頭,那麼使用match 而不是search 會錨定搜尋,而不必顯示地在搜尋模式中包含乙個錨。import re text th...

第一章 文字 re 正規表示式 搜尋選項 3

1.3.7.3 unicode 在python3中,str物件使用完整的unicode字符集,str的正規表示式處理會假設模式和輸入文字都是unicode.之前描述的轉義碼預設的也是按unicode定義。這些假設意味著模式 w 對單詞 french 和 fran ais 都能匹配。要向python2...