培訓第六課 re的使用
re使用流程:模式串->運算式對象->匹配目標文本
常用元字元:
. :除分行符號以外的任何字元
\ :逸出字元 當我們把元字元當做一般字元去匹配的時候
[] :字元集合匹配
\d :數字匹配 0-9
\D :非數位匹配[^0-9]
\s :非空白字元[ \t\r\n\f\n]
\S :f非空白字元[^\s]
\w :字母數字[A-Za-z0-9]
\W :非字母數字[^\w]
#說白了,大寫和小寫正好是補集的關係
#使用compile會快一點
>>> p = re.compile(r'nihao')
>>> type(p)
<type '_sre.SRE_Pattern'>
#匹配字元前面加r,少一些不必要的麻煩
In [10]: rs = p.match('abc abcde abcdd')
#使用mathch方法,匹配成功返回一個mactch對象,沒有成功就返回None
In [11]: print rs
<_sre.SRE_Match object at 0x03638918>
In [12]: rs.group() #mathc只返回一個匹配到的字元
Out[12]: 'abc'
數量匹配:
+ :一次或者多次
?:一次或者0次
* :任意次數,0次,1次,多次
{m} :匹配前一個字元m次
{m,n}: 匹配前一個字元m到n次
數量詞?:非貪婪模式 ex:[i]*?
In [14]: p = re.compile('[abc]{2,3}') #預設是貪婪模式,總是匹配到最大限度
In [15]: p.findall('abcabcbc')
Out[15]: ['abc', 'abc', 'bc']
In [16]: p = re.compile('[abc]{2,3}?') #加了?以後變成非貪婪,最小匹配就返回
In [17]: p.findall('abcabcbc')
Out[17]: ['ab', 'ca', 'bc', 'bc']
邊界:
^ :匹配字串的開頭,多行就匹配每一行的開頭
$ :匹配字串的結尾,多行就匹配每一行的結尾
\A :僅匹配字串的開頭
\Z :僅匹配字串的末尾
\b :匹配 \w \W之間
邏輯分組:
| :或操作
(..) :分組匹配,匹配傳回值
(?...):分組匹配,不返回匹配值
\<num> :引用到編號為num的分組匹配到的串
(?P<name>):分組命名
(?p=name): 引用分組,不提取值
#分組操作和group字樣的方法關係密切
#不分組不提取
In [52]: re.findall(r'(?:a)b','abc')
Out[52]: ['ab']
#分組命名
In [54]: m = re.match(r'(?P<a>a)(b)','abc')
In [55]: m.groups()
Out[55]: ('a', 'b')
In [56]: m.groupdict()
Out[56]: {'a': 'a'}
特殊構造:
(?:..) :不分組
(?iLmsux) :不同模式
(?#...) :#注釋
(?=...) :之後滿足才返回字元
(?!...) :
(?<=...) :
(?<!...) :
(?(id/name)yes|no) :
In [69]: re.findall(r'a(?=\d)','a3 a4')
Out[69]: ['a', 'a']
匹配模式:
re.I 忽略大小寫
re.M 多行模式改變為^ $的行為,忽略換行
re.S .任意匹配模式,包括換行
re.U 使用\w\W\b\B\s\S\d\D取決於UNIcode字元屬性
re.X 詳細模式
re.L 使用預訂字串類\w\W\b\B\s\S取決於目前範圍設定
(?iLmsux) :不同模式 一般放在運算式的開頭,其他位置也行
常用函數:
compile
pattern
match
serach
split
findall
finditer
sub
?match和search的區別