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

2021-09-10 06:40:19 字數 2124 閱讀 5729

1.3.5 限制搜尋

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

import re

text =

'this is some text -- with punctuation.'

pattern =

'is'

print

('text :'

,text)

print

('pattern:'

,pattern)

m = re.match(pattern,text)

print

('match :'

,m)s = re.search(pattern,text)

print

('search:'

,s)

由於字面量文字is未出現在輸入文字的開頭,因此使用match()時找不到它。不過,這個序列在文字中另外還出現了兩次,所以search()能找到。

執行結果:

text : this is some text – with punctuation.

pattern: is

match : none

search:

fullmatch()方法要求整個輸入字串與模式匹配。

import re

text =

'this is some text -- with punctuation.'

pattern =

'is'

print

('text :'

,text)

print

('pattern :'

,pattern)

m = re.search(pattern,text)

print

('search :'

,m)s = re.fullmatch(pattern,text)

print

('full match:'

,s)

這裡search()顯示模式確實出現在輸入中,但是它沒能消費所有輸入,所以fullmatch()不會報告匹配。

執行結果:

text : this is some text – with punctuation.

pattern : is

search :

full match: none

已編譯正規表示式的search()方法還接受可選的start和end位置引數,將搜尋範圍限制到輸入的乙個子串中。

import re

text =

'this is some text -- with punctuation.'

pattern = re.

compile

(r'\b\w*is\w*\b'

)print

('text:'

,text)

print()

pos =

0while

true

: match = pattern.search(text,pos)

ifnot match:

break

s = match.start(

) e = match.end(

)print

(' : = "{}"'

.format

(s,e -

1,text[s:e]))

# move forward in text for the next search.

pos = e

執行結果:

text: this is some text – with punctuation.

0 : 3 = 「this」

5 : 6 = 「is」

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

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

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

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

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

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