python 正則表示式re模組
#####################總結##############
優點: 靈活, 功能性強, 邏輯性強.
缺點: 上手難,旦上手, 會愛上這個東西
工具: 各大文字編輯器一般都有正則匹配功能. 我們也可以去 http://tool.chinaz.com/regex/進行線上測試.
正則表示式由普通字元和元字元組成,普通字元包含大小寫字母, 數字,在匹配普通字元的時候我們直接寫就可以了
(1) 字元組
字元組很簡單用[]括起來,在[]中出現的內容會被匹配,例如:[abc] 匹配a或b或c
[a-z] 匹配a到z之間的所有字母, [0-9]匹配所有阿拉伯數字
[a-zA-Z0-9] : 匹配的是大寫字母,小寫字母和阿拉伯數字
(2)簡單元字元
- . 匹配除換行符以外的任意字元
- \w 匹配字母或數字下劃線
- \s 匹配任意的空白符
- \d 匹配數字
- \n 匹配一個換行符
- \t 匹配一個製表符
- \b 匹配一個單詞的結尾
- ^ 匹配字串的開始
- $ 匹配字串的結尾
- \W 匹配非字母或數字或下劃線
- \D 匹配非數字
- \S 匹配非空白符
- a|b 匹配字元a或字元b
- () 匹配括號內表示式,也表示一個組
- [......] 匹配字元組中的字元
- [^...] 匹配除了字元組中字元的所有字元
(3)量詞
當一次性匹配多個字元時,需要用到量詞
- * 重複零次或更多次
- + 重複一次或多次
- ? 重複零次或一次
- {n} 重複n次
- {n,} 重複n次或者更多次
- {n,m}重複n到m次
(4)惰性匹配和貪婪匹配
在量詞中 *,+,{ }都屬於貪婪匹配,就是儘可能多的匹配到結果.
str: 麻花藤昨天讓英雄聯盟關服了 reg: 麻花藤.* 此時匹配的是整句話
在使用.*後面如果加了? 則是儘可能少的匹配,
str: 麻花藤昨天讓英雄聯盟關服了 reg: 麻花藤.*? 此時匹配的是 麻花藤
.*?x的特殊含義找到下一X為止
str: abcdefgxhijklmn reg: .*?x 結果: abcdefgx
(5) 分組
在正則中使用()進行分組.
比如. 我們要匹配身份證號,身份證號分成兩種,老的身份證號有15位,新的身份證號有18位,並且新的身份證號結尾有可能是x
給出以下正則: ^[1-9]\d{13,16}[0-9x]$ 錯誤 ^[1-9]\d{14}(\d{2}[0-9x])?$ 正確 ^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ 正確
(6)轉義:
在正則表示式中, 有很多有特殊意義的是元字元,比如\n和\s等,如果要在正則中匹 配正常的"\n"而不是"換行符"就需要對"\"進行轉義, 變成'\\'.
在python中, 無論是正則表示式, 還是待匹配的內容, 都是以字元串的形式出現的, 在字元串中\也有特殊的含義, 本身還需要轉義.
所以如果匹配一次"\n", 字串中要寫成'\\n', 那麼正則里就要寫成"\\\\n",這樣就太麻煩了. 這個時候我們就用到了r'\n'這個概念, 此時的正則是r'\\n'就可以了