一切內容都是摘抄,主要是便於回憶和鼓勵自己不要間斷,更詳細內容請見原帖地址:
《深入 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. 鬆散正則表達式
鬆散正字表達式和普通緊湊的正則表達式有兩點不同:
- 空白符被忽略。空格、製表符和回車在正則表達式中並不會匹配空格、製表符、回車。如果你想在正則表達式中匹配他們,可以在前面加一個/來轉義。
- 註釋信息被忽略。鬆散正字表達式中的註釋和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()函數來獲取到匹配的值。