7.17正则表达式与re模块
正則表達式
這里介紹的只是正則的一點點皮毛,如果要詳細了解可以看書《正則指引》
1.re模塊與正則表達式之間的關系
(1)正則表達式不是python獨有的,它是一門獨立的技術
(2)所有的編程語言都可以使用正則
(3)但是如果你想在python中使用,你就必須依賴于re模塊
2.正則的作用
正則就是用來篩選字符串中的特定的內容的
3.正則的應用場景
(1)爬蟲
(2)數據分析
只要是reg...一般情況下都是跟正則有關
4.正則表達式在線測試工具:http://tool.chinaz.com/regex/
5.如果想匹配具體的內容
那么可以直接寫完整的內容,不需要寫正則
6.字符組:[ ]
在同一個位置可能出現的各種字符組成了一個字符組,在正則表達式中用[ ]表示,字符分為很多類,比如數字、字母、標點等等,一個字符組里面的表達式都是或的關系
如果我們現在要求一個位置只能出現一個數字,那么這個位置上的字符只能是0、1、2...9這10個數中的一個,那怎么用正則表達式寫呢
7.字符
以上每個正則字符只針對單個字符
(1)^與$符連用的情況
例如:^francis$
會精準限制匹配的內容,兩者中間寫什么,匹配的字符串就必須是什么,多一個也不行少一個也不行
(2)abc|ab的情況
一定要將長的放在前面,匹配規則是如果|前面的匹配上了,|后面的就被舍棄了,所以一定要將長的放在前面
(3)\w,\s,\d與\W,\S,\D相反的匹配關系(對應的兩者結合就是匹配全局)
[\w\W]、[\s\S]、[\d\D]
(4)\b匹配一個單詞的結尾
n\b:要寫上單詞以什么結尾(此處表示單詞以n結尾),否則無法匹配
(5)^a、[^a]、[^a-z]
^a:如果^直接寫在外面,是限制字符串的開頭,判斷以什么開頭
[^a]:如果寫在里面,表示除了[ ]內寫的字符,其他都要(取反)
(6)分組
當多個正則符號需要重復多次的時候,或者當做一個整體進行其他操作,那么可以寫成分組的形式,分組在正則的語法中就是()
([a-z][0-9])*
8.量詞
(1)正則在匹配的時候默認都是貪婪匹配(盡量匹配多的)
? 你可以通過在量詞后面加上一個?,就可以將貪婪匹配變成非貪婪匹配(惰性匹配)
\d*、\d+、\d?默認是貪婪匹配的
\d*?、\d+?、\d??修改為多惰性匹配
(2){n}:明確指定個數
\d{2}
(3)量詞必須跟在正則符號的后面
量詞只能夠限制緊挨著它的那一個正則符號
\s\d*? 這里的量詞*只對\d有效
9.轉義符
(1)在正則表達式中,有很多有特殊意義的是元字符,比如\n和\s等,如果要在正則中匹配正常的"\n"而不是"換行符"就需要對"\"進行轉義,變成"\\"
(2)在python中,無論是正則表達式,還是待匹配的內容,都是以字符串的形式出現的,在字符串中\也有特殊的含義,本身還需要轉義
(3)簡便操作,利用r可以讓整個字符串都不再轉義(了解:r其實就是real的意思,真實不轉義)
?
?10.貪婪匹配與非貪婪匹配
(1)<.*>:先拿著里面的.*去匹配所有的內容,然后再根據>往回退著找,遇到>即停止
(2)<.*?>:先拿著?后面的>去匹配符合條件的最少的內容,然后把匹配的結果返回?
舉例:.*?x
就是取前面任意長度的字符,直到第一個x出現
re模塊
1.三個必須掌握的方法
(1)findall
import re ret = re.findall('a', 'eva egon yuan') # 第一個參數是正則表達式,第二個參數是待匹配的文本內容 print(ret) # 返回所有滿足匹配條件的結果,并且返回的是一個列表,列表中的元素就是正則匹配到的結果(2)search
import re ret = re.search('a', 'eva egon yuan') print(ret) # search不會給你直接返回匹配到的結果,而是給你返回一個對象 print(ret.group()) # 必須調用group才能看到匹配到的結果 # 如果字符串沒有匹配,則返回None,并且需要注意的是如果ret是None,再調用.group()會直接報錯 if ret: # 可以通過if判斷來進行篩選print(ret.group())注意:
search只會依據正則查一次,只要查到了結果,就不會再往后查找
當查找的結果不存在的情況下,調用group直接報錯
(3)match
import re ret = re.match('a', 'abc') # 同search,不過僅在字符串開始處進行匹配 print(ret) # match不會給你直接返回匹配到的結果,而是給你返回一個對象 print(ret.group()) # 必須調用group才能看到匹配到的結果 # match是從頭開始匹配,如果正則規則從頭開始可以匹配上,就返回一個對象,需要用group才能顯示 if ret: # 如果沒匹配上就返回None,調用group()就會報錯,可以通過if判斷來進行篩選print(ret.group())注意:
match只會匹配字符串的開頭部分
當字符串的開頭不符合匹配規則的情況下,返回的也是None,調用group也會報錯
2.其他方法
(1)split
import re ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在對''和'bcd'分別按'b'分割 print(ret) # ['', '', 'cd'] 返回的還是列表(2)sub
import re ret = re.sub('\d', 'H', 'eva3egon4yuan4',1) # 將數字替換成'H',參數1表示只替換1個,不寫默認全替換 # sub('正則表達式','新的內容','待替換的字符串',n) # 先按照正則表達式查找所有符合該表達式的內容,統一替換成'新的內容',還可以通過傳參來控制替換的個數 print(ret) # evaHegon4yuan4(3)subn
import re ret = re.subn('\d', 'H', 'eva3egon4yuan4') # 將數字替換成'H',返回元組(替換的結果,替換了多少次) ret1 = re.subn('\d', 'H', 'eva3egon4yuan4',1) # 將數字替換成'H',還可以通過傳參來控制替換的個數,返回元組(替換的結果,替換了多少次) print(ret) # 返回的是一個元組 元組的第二個元素代表的是替換的個數(4)compile
import re obj = re.compile('\d{3}') # 將正則表達式編譯成為一個正則表達式對象,規則要匹配的是3個數字 ret = obj.search('abc123eeee') # 正則表達式對象調用search,參數為待匹配的字符串 res1 = obj.findall('347982734729349827384') print(ret.group()) # 結果 : 123 print(res1) # 結果 : ['347', '982', '734', '729', '349', '827', '384'](5)finditer
import re ret = re.finditer('\d', 'ds3sy4784a') # finditer返回一個存放匹配結果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) # 查看第一個結果,等價于ret.__next__().group() print(next(ret).group()) # 查看第二個結果,等價于ret.__next__().group() print([i.group() for i in ret]) # 查看剩余的匹配結果3.findall的優先級查詢:分組優先機制
import re res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023') print(res.group()) print(res.group(1)) # 獲取正則表達式括號闊起來分組的內容 print(res.group(2)) # search與match均支持獲取分組內容的操作,這個功能跟正則無關是python的機制 # 而針對findall它沒有group取值的方法,所以它默認就是分組優先獲取的結果 ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com') print(ret) # 結果:['oldboy'] # 這是因為findall會優先把匹配結果組里的內容返回,如果想要匹配結果,取消權限即可 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') # ?:取消分組優先 print(ret) # ['www.oldboy.com']4.給某一個正則表達式起別名:?<name>
import re ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>") # 還可以在分組中利用?<name>的形式給分組起名字 # 獲取的匹配結果可以直接用group('名字')拿到對應的值 print(ret.group('tag_name')) # 獲取的匹配結果可以直接用group('名字')拿到對應的值,結果:h1 print(ret.group()) # 結果:<h1>hello</h1>注意:
?P=tag_name相當于引用之前正則表達式,并且匹配到的值必須和前面的正則表達式一模一樣
5.split的優先級查詢:分組優先機制
import re ret=re.split("\d+","eva3egon4yuan") print(ret) #結果 : ['eva', 'egon', 'yuan'] ret1=re.split("(\d+)","eva3egon4yuan") print(ret1) #結果 : ['eva', '3', 'egon', '4', 'yuan'] # 會把切除的內容保存下來轉載于:https://www.cnblogs.com/francis1/p/11203877.html
總結
以上是生活随笔為你收集整理的7.17正则表达式与re模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: design/sourcecode/课堂
- 下一篇: 六安构建智慧城市节水管理平台