Python標(biāo)準(zhǔn)庫re的使用舉例(正則化匹配)
常用正則表達(dá)式
正則表達(dá)式 描述 匹配結(jié)果 \d+(\.\d*)? 任意整數(shù)和浮點(diǎn)數(shù) 0.004 2 75. \b[^\Wa-z0-9_][^\WA-Z0-9_]*\b 首字母只能大寫 Boo Foo ^http:\/\/([\w-]+(\.[\w-]+)+(\/[\w-.\/\?%&=\u4e00-\u9fa5]*)?)?$ 驗(yàn)證網(wǎng)址 http://www.baidu.com/?id=1 ^[\u4e00-\u9fa5]{0,}$ 驗(yàn)證漢字 漢字漢字 \w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 驗(yàn)證電子郵件 example@163.com ^[1-9]([0-9]{16}|[0-9]{13})[xX0-9]$ 驗(yàn)證身份證 14525419951215445X ^13[0-9]{1}[0-9]{8}|^15[9]{1}[0-9]{8} 驗(yàn)證手機(jī)號 138459572*** ^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]) 驗(yàn)證IP 192.168.1.1 \.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0) \.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0) \.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$ ^[a-zA-Z0-9]+([a-zA-Z0-9\-\.]+)?\.s|)$ 驗(yàn)證域名 baidu.com ^([a-zA-Z]\:|\\)\\([^\\]+\\)*[^\/:*?"<>|]+\.txt(l)?$ 驗(yàn)證文件路徑 C:\user\wo <(.*)>(.*)<\/(.*)>|<(.*)\/> HTML標(biāo)簽匹配(需修改) xxxx
一,必備知識
1.修飾符(flag)
re.I 使匹配對大小寫不敏感 re.L 做本地化識別匹配 re.M 多行匹配,影響^和$ re.S 使.匹配包括換行在內(nèi)的所有字符 re.U 根據(jù)Unicode字符集解析字符.這個(gè)標(biāo)志影響\w \W \b \B re.X 該標(biāo)志通過給予你更靈活的格式以便你將正則表達(dá)式寫的更易于理解. # 例子 result = re.match('^The.*?(\d+).*?phone.', content, re.S)
2.匹配模式
^ 匹配字符串開頭
$ 匹配字符串結(jié)尾
. 匹配人以字符,除了換行符號.當(dāng)re.DOTAALL標(biāo)記被指定時(shí),則可以匹配包括換行符的任意字符.
[...] 用來表示一組字符,單獨(dú)列出:[amk]匹配a,m或k
[^...] 不在[]中的字符:[^amk]匹配除amk之外的字符
re* 匹配0個(gè)或多個(gè)的表達(dá)式
re+ 匹配1個(gè)或多個(gè)的表達(dá)式
re? 匹配0個(gè)或1個(gè)由前面的正則表達(dá)式定義的片段,非貪婪方式.
re{n} 精準(zhǔn)匹配n個(gè)前面表達(dá)式
re{n,} 匹配大于等于n個(gè)前面表達(dá)式
re{n,m} 匹配n到m個(gè)前面的表達(dá)式定義的片段,貪婪方式
a|b 匹配a或b
(re) 對正則表達(dá)式分組,并記住匹配的文本
(?imx) 正則表達(dá)式包含三種可選標(biāo)志,imx,只影響括號中的區(qū)域.
(?-imx) 正則表達(dá)式關(guān)閉imx可選標(biāo)志,只影響括號中的區(qū)域.
(?:re) 類似(...)但不表示一個(gè)組
(?imx:re) 在括號中使用imx可選標(biāo)志
(?-imx:re) 在括號中不是用imx可選標(biāo)志
(?#...) 注釋
(?=re) 前向肯定界定符.如果所含正則表達(dá)式,以...表示,在當(dāng)前位置成功匹配時(shí)成功,否則失敗.但一旦所含表達(dá)式已經(jīng)嘗試,匹配引擎根本沒有提高,模式的剩余部分還要嘗試界定符右邊.
(?!re) 前向否定界定符.與肯定界定符相反;當(dāng)所含的表達(dá)式不能在字符串當(dāng)前位置匹配成功時(shí)成功.
(?>re) 匹配的獨(dú)立模式,省去回朔.
\w 匹配字符數(shù)字以及下劃線
\W 匹配非字母數(shù)字下劃線
\s 匹配任意空白字符,等價(jià)于[\t\n\r\f]
\S 匹配任意非空白字符
\d 匹配任意數(shù)字
\D 匹配任意非數(shù)字
\A 匹配字符串開始
\Z 匹配字符串結(jié)束,如果是存在換行,只匹配到換行前的結(jié)束字符串.
\z 匹配字符串結(jié)束
\G 匹配最后匹配完成的位置
\b 匹配一個(gè)單詞邊界,也就是指單詞和空格之間的位置
\B 匹配非單詞邊界
\n \t 匹配一個(gè)換行符,一個(gè)制表符
\1...\9 匹配第n個(gè)分組的內(nèi)容
3. r的作用
- r’(\w+) (\w+)(?P.*)’,字符串之前的r可以避免轉(zhuǎn)行符混淆
正則表達(dá)式使用反斜杠來表示特殊形式,或者把特殊字符轉(zhuǎn)義成普通字符。
而反斜杠在普通的 Python 字符串里也有相同的作用,所以就產(chǎn)生了沖突。
解決辦法是對于正則表達(dá)式樣式使用 Python 的原始字符串表示法;在帶有 ‘r’ 前綴的字符串字面值中,反斜杠不必做任何特殊處理。
import re if re.search(r'\\d', 'I have one nee\dle') is not None: print('match it',re.search(r'\\d', 'I have one nee\dle').group(0)) else: print('not match') # match it \d
4. 貪婪與非貪婪—通配符后面加?
在貪婪匹配下,.* 會匹配盡可能多的字符。
正則表達(dá)式中.*后面是\d+,也就是至少一個(gè)數(shù)字,并沒有指定具體多少個(gè)數(shù)字,因此,.*就盡可能匹配多的字符,這里就把12345匹配了,給\d+留下個(gè)可滿 足條件的數(shù)字 6.最后得到的內(nèi)容就只有數(shù)字6了
import re content = 'The 123456 is my one phone number.' print('貪婪匹配:') result = re.match(r'^The.*(\d+).*', content) #使用match匹配, 第一個(gè)參數(shù)為正則表達(dá)式, 第二個(gè)為要匹配的字符串 print(result.group()) #輸出匹配內(nèi)容 print('result = %s'%result.group(1)) #輸出第一個(gè)被()包裹的內(nèi)容 print('-'*20) print('非貪婪匹配:') result = re.match(r'^The.*?(\d+).*', content) print(result.group()) print('result = %s'%result.group(1)) # 貪婪匹配: # The 123456 is my one phone number. # result = 6 # -------------------- # 非貪婪匹配: # The 123456 is my one phone number. # result = 123456
5.轉(zhuǎn)義匹配的使用
由于()屬于正則表達(dá)式的特殊字符, 因此在需要匹配()時(shí), 需要加上轉(zhuǎn)義字符\.
import re content = '(百度)www.baidu.com' result = re.match('(百度)www.baidu.com', content) result2 = re.match('\(百度\)www\.baidu\.com', content) if result: print(result.group()) else: print('result = None') if result2: print(result2.group()) else: print('result2 = None') # result = None # (百度)www.baidu.com
6. group(num = 0)和groups( )
- group 函數(shù)有一個(gè)int類型的參數(shù),參數(shù)為0表示返回正則匹配的字符串,參數(shù)為1返回正則中第一個(gè)組匹配的內(nèi)容,2返回第二組的內(nèi)容一次類推
- groups 函數(shù)是所有g(shù)roup函數(shù)結(jié)果組成一個(gè)元組。
二,函數(shù)應(yīng)用
1. re.compile(pattern,flags=0)—自定義匹配模板
- 他的第一個(gè)參數(shù)是正則字符串,第二個(gè)參數(shù)是修飾符
- 編譯成一個(gè)正則表達(dá)式對象,可以用于匹配match/search/findall 方法 序列
- 在需要匹配相同正則表達(dá)式情況下, 事先定義一個(gè)compile可以簡化代碼量, 同時(shí)compile中也可以使用修飾符r.S等.
import re content1 = '2016-1-1 12:01' content2 = '2017-1-1 12:02' content3 = '2018-1-1 12:03' pattern = re.compile('\d{2}:\d{2}') result1 = re.sub(pattern, '', content1) result2 = re.sub(pattern, '', content2) result3 = re.sub(pattern, '', content3) print(result1, result2, result3) #2016-1-1 2017-1-1 2018-1-1
2. re.match(pattern,string,flags=0)—從第一個(gè)字符開始匹配
- 該函數(shù)從第一個(gè)字符開始匹配,如果第一個(gè)對不上,就不可能匹配到數(shù)據(jù)。
- 從第一個(gè)字符開始進(jìn)行匹配,不成功則返回None。
- 一個(gè)正則表達(dá)式中若有多個(gè)()可用group方法輸出,比如:ex_re=re.match(‘(.?)actor(.?)$’),可用ex_re.group()訪問生成的列表,可用ex_re.group(0)訪問第一個(gè)括號里的元素。
- pettern 就是正則字符串,如果是通過re.compile方法生成的正則對象.match來調(diào)用的話,就不需要這個(gè)參數(shù)了,因?yàn)檎齽t對象本身就代表了一個(gè)正則匹配模式。
- string 就是要進(jìn)行匹配的目標(biāo)字符串
- flags 就是正則的修飾符,比如 re.I
import re regex = '(foo\w)(\w)' m = re.match(r'(foo\w)(\w)','fooasdfooasd') if m is not None: print(m.group(1)) print(m.groups()) #輸出 #fooa #('fooa', 's')
3. re.search(pattern,string,flags=0)—不固定開始,但是只匹配第一個(gè)
- re.search()并不要求必須從字符串的開頭進(jìn)行匹配如match(),也就是說,正則表達(dá)式可以是字符串的一部分。
- 用法基本與match相同,只不過是掃描整個(gè)字符串,從一開始匹配到的地方開始。
import re regex = '<(.*)>(.*)<\/(.*)>|<(.*)\/>' m = re.search(regex,"aa<a>aaaa</a>") #一樣只有search能匹配到標(biāo)簽 if m is not None: print(m) print(m.group()) # 結(jié)果 # <re.Match object; span=(2, 13), match='<a>aaaa</a>'> # <a>aaaa</a>
4. re.findall(pattern, string,[, flags])—匹配所有數(shù)據(jù)
- match()和search()都是返回匹配到的第一個(gè)內(nèi)容就結(jié)束匹配, findall()是返回所有符合匹配規(guī)則的內(nèi)容
- 搜索字符串內(nèi),以列表形式返回全部能匹配的子串。
import re text = "I am so happy! " array1 = re.findall("[a-zA-Z]", text) array2 = re.findall("[a-zA-Z]+", text) print(array1) print(array2) #結(jié)果 # ['I', 'a', 'm', 's', 'o', 'h', 'a', 'p', 'p', 'y'] # ['I', 'am', 'so', 'happy']
5. finditer(pattern, string,[,flags] )—返回的是匹配到的迭代器對象
與findall()相同,但返回的是一個(gè)迭代器。對于每一次匹配,迭代器都能返回一個(gè)匹配對象
import re regex = 'apple' m = [ g.group() for g in re.finditer(regex,'apple1 apple2 apple3')] print(m) #輸出 #['apple', 'apple', 'apple']
6. split(pattern, string, max = 0)
根據(jù)正則表達(dá)式的模式分隔符,split函數(shù)將字符串分割為列表,返回匹配列表,分割最多操作max次
import re list = [ 'aaa,bbb,ccc', 'ddd,eee,fff', ] for i in list: print(re.split(',',i)) # ['aaa', 'bbb', 'ccc'] # ['ddd', 'eee', 'fff']
7. re.sub(pattern, repl, string, count=0, flags=0)—可正則的字符串替換
替換字符串中的某些子串,可以用正則表達(dá)式來匹配被選子串。
pattern:表示正則表達(dá)式中的模式字符串;
repl:被替換的字符串(既可以是字符串,也可以是函數(shù));
string:要被處理的,要被替換的字符串;
count:匹配的次數(shù), 默認(rèn)是全部替換
import re st = "hello 2019" st = re.sub("([0-9]+)","yudengwu",st) print(st) #結(jié)果 # hello yudengwu
8. str.replace(old, new,max)—不是re函數(shù),僅用作字符串替換
- 替代字符串中的某一些子串為另一些字符。
- old – 將被替換的子字符串。
- new – 新字符串,用于替換old子字符串。
- max – 可選字符串, 替換不超過 max 次
import re st = "我喜歡你,喜歡你" st = st.replace("喜歡","愛",1) print(st) # 我愛你,喜歡你
總結(jié)
到此這篇關(guān)于Python標(biāo)準(zhǔn)庫re的使用舉例的文章就介紹到這了,更多相關(guān)Python標(biāo)準(zhǔn)庫re使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對pandas的算術(shù)運(yùn)算和數(shù)據(jù)對齊實(shí)例詳解
今天小編就為大家分享一篇對pandas的算術(shù)運(yùn)算和數(shù)據(jù)對齊實(shí)例詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python實(shí)現(xiàn)區(qū)域填充的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)區(qū)域填充的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Python 數(shù)據(jù)結(jié)構(gòu)之樹的概念詳解
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之樹的概念詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09