深入Python3 (Dive Into Python3)筆記5--正則表達式

一切內容都是摘抄,主要是便於回憶和鼓勵自己不要間斷,更詳細內容請見原帖地址:

《深入 python3 》中文版

http://woodpecker.org.cn/diveintopython3/index.html

 

 

5.1. 深入

5.2. 案例研究: 街道地址

4.是時候轉換到正則表達式了。在python中,所有的正則表達式相關功能都包含在re模塊中。

re.sub('ROAD$', 'RD.', s)

正則表達式模塊的re.sub()函數可以做字符串替換,它在字符串s中用正則表達式‘ROAD$’來搜索並替換成‘RD.’。它只會匹配字符串結尾的‘ROAD’,而不會匹配到‘BROAD’中的‘ROAD’,因爲這種情況它在字符串的中間。

re.sub('//bROAD$', 'RD.', s)

爲了在正則表達式中表達這個獨立的詞,你可以使用‘/b’。它的意思是“在右邊必須有一個分隔符”。在python中,比較複雜的是‘/’字符必須被轉義,這有的時候會導致‘/’字符傳染(想想可能還要對/字符做轉義的情況)。

re.sub(r'/bROAD$', 'RD.', s)

2.爲了解決‘/’字符傳染的問題,可以使用原始字符串。這只需要在字符串的前面添加一個字符‘r’。它告訴python,字符串中沒有任何字符需要轉義。‘/t’是一個製表符,但r‘/t’只是一個字符‘/’緊跟着一個字符t。我建議在處理正則表達式的時候總是使用原始字符串。否則,會因爲理解正則表達式而消耗大量時間(本身正則表達式就已經夠讓人困惑的了)。

5.3. 案例研究: 羅馬數字

5.3.1. 檢查千位數

? 表示匹配是可選的

5.3.2. 檢查百位數

5.4. 使用語法{n,m}

{1,4} 匹配1到4個前面的模式

5.4.1. 檢查十位和個位

(A|B) 匹配A模式或者B模式中的一個

5.5. 鬆散正則表達式

鬆散正字表達式和普通緊湊的正則表達式有兩點不同:

  1. 空白符被忽略。空格、製表符和回車在正則表達式中並不會匹配空格、製表符、回車。如果你想在正則表達式中匹配他們,可以在前面加一個/來轉義。
  2. 註釋信息被忽略。鬆散正字表達式中的註釋和python代碼中的一樣,都是以#開頭直到行尾。它可以在多行正則表達式中增加註釋信息,這就避免了在python代碼中的多行註釋。他們的工作方式是一樣的。

re.search(pattern, 'M', re.VERBOSE)

注意,如果要使用鬆散正則表達式,需要傳遞一個叫re.VERBOSE的參數。

5.6. 案例研究: 解析電話號碼

/d 匹配所有0-9的數字. /D 匹配除了數字外的所有字符.

phonePattern = re.compile(r'^(/d{3})-(/d{3})-(/d{4})$')

phonePattern.search('800-555-1212').groups()

phonePattern = re.compile(r'^(/d{3})/D+(/d{3})/D+(/d{4})/D+(/d+)$')

注意了!你匹配了字符串開始,然後是3個數字的分組,接着是/D+,這是什麼?好吧,/D匹配除了數字以外的任意字符,+的意思是一個或多個。因此/D+匹配一個或一個以上的非數字字符。這就是你用來替換連字符的東西,它用來匹配不同的分隔符。

5.7. 小結

現在,你應該已經熟悉了下面的技巧:

  • ^ 匹配字符串開始位置。
  • $ 匹配字符串結束位置。
  • /b 匹配一個單詞邊界。
  • /d 匹配一個數字。
  • /D 匹配一個任意的非數字字符。
  • x? 匹配可選的x字符。換句話說,就是0個或者1個x字符。
  • x* 匹配0個或更多的x。
  • x+ 匹配1個或者更多x。
  • x{n,m} 匹配n到m個x,至少n個,不能超過m個。
  • (a|b|c) 匹配單獨的任意一個a或者b或者c。
  • (x) 這是一個組,它會記憶它匹配到的字符串。你可以用re.search返回的匹配對象的groups()函數來獲取到匹配的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章