正則表達式
字符匹配
普通字符:大多數(shù)字符和字母都會和自身匹配
元字符:.^$*+?{}[]|()\
re模塊
re是python中的正則表達式模塊,re模塊中包含了正則表達式的語法
API方法
- findAll() 按照指定的模式查找所有的符合的元素
- search() 尋找到第一個符合模式的元素就會停止尋找,會返回一個對象
- compile(reg) 先將正則表達式編譯為一個對象伊佃,然后再使用編譯后的對象調(diào)用p.search p.findAll() 后跟要匹配的字符串
- sub() 還需要一個額外的參數(shù)replacement窜司,它會把source中所有匹配的pattern替換成replacement
rep = re.search('aaa','aaacccaaa')
print(rep.group())
元字符解釋
- . 代表除換行符(\n)外的任意字符,只能代指任意一個字符
- ^ 匹配開頭
- $ 匹配結(jié)束
- * 重復(fù)匹配 表示* 前面的元素出現(xiàn)0到多次
re.findall('a*','aaaabbbb')
- 表示匹配1到多次航揉,至少有1次
- 塞祈?表示匹配0到1次,至多1次
- {n帅涂,m}表示匹配n到m次 貪婪匹配
pre(m) m個連續(xù)的pre
pre(m,n) m到n個連續(xù)的pre,盡可能多地匹配
pre(m,n)? m到n個連續(xù)的pre议薪,盡可能少的匹配
- []字符集,字符集內(nèi)的內(nèi)容代表范圍漠秋,[m,n]表示m或者是n的一個 [^n]表示匹配除n以外的
字符集[]還有取消元字符的特殊功能笙蒙,在[]中的元字符沒有特殊功能的定義 例如 [*] 中的 * 就代表 * 這個字符 -除外 - () 分組功能作為一個整體
- | 或者
expr1|expr2 匹配expr1或expr2
[a-z] 表示a-z范圍中的任意一個字母
- \ 反斜杠后邊跟元字符去除特殊功能,反斜杠后跟普通字符實現(xiàn)特殊功能
- \d 代表數(shù)字 相當于[0-9]
- \D 匹配任何非數(shù)字字符 相當于[^0-9]
- \s 匹配任何空白字符 [\t\n\r\f\v]
- \S 匹配任何非空白字符 [^ \t\n\r\f\v]
- \w 匹配任何字母數(shù)字字符 [a-zA-Z0-9]
- \W 匹配任何非字母數(shù)字字符 [^a-zA-Z0-9]
- \b 匹配一個特殊字符的( 庆锦,#¥等)邊界捅位。
- \B 匹配非單詞邊界
Python使用正則表達式
使用正則表達式,相關(guān)的功能都位于標準庫模塊re中搂抒。需要先定義一個用于匹配的模式字符串以及一個匹配的對象:源字符串
result = re.match('You','Youareme')
對于更加復(fù)雜的匹配艇搀,可以先對模式進行編譯以加快匹配速度,然后就可以直接使用編譯好的模式進行匹配
>>> youpattern = re.compile('You')
>>> youpattern.match('You are mine')
<_sre.SRE_Match object; span=(0, 3), match='You'>
使用match()進行準確匹配
判斷單詞'Young'是以單詞'You'開頭
>>> source = 'Young'
>>> m = re.match('You',source)
>>> if m:
... print(m.group())
...
You
- match()函數(shù)用于查看源是否以指定模式開頭求晶,search()可以檢測任何位置的匹配
>>> mm = re.search('ung',source)
>>> if mm:
... print(mm.group())
...
ung
使用findall()尋找所有匹配
findall()會返回指定的模式串在源串中出現(xiàn)的所有列表
>>> source_all = 'hello hello hello how are you'
>>> m = re.find
>>> m = re.findall('o',source_all)
>>> m
['o', 'o', 'o', 'o', 'o']
使用split() 按匹配切分
split()將一個字符串切分成由一系列子串組成的列表
>>> m = re.split('l',source_all)
>>> m
['he', '', 'o he', '', 'o he', '', 'o how are you']
使用sub()替換匹配
使用sub替換匹配和字符串的replace有些類似焰雕,只不過使用的是模式而不是文本串
>>> m = re.sub('l','?',source_all)
>>> m
'he??o he??o he??o how are you'
定義模式匹配的輸出
當使用match()或search()時,所有的匹配會以m.group()的形式返回到對象m中芳杏。如果使用括號將自己的某一模式包裹起來矩屁,括號中模式匹配得到的結(jié)果歸入自己的froup中,如果調(diào)用m.groups()可以得到包含這些匹配的元組爵赵,使用(? P <name> expr) 這樣的模式會匹配expr吝秕,并將匹配結(jié)果存儲到名為name的組中