Python標準庫re的使用舉例(正則化匹配)
常用正則表達式

正則表達式 描述 匹配結果
\d+(\.\d*)? 任意整數(shù)和浮點數(shù) 0.004 2 75.
\b[^\Wa-z0-9_][^\WA-Z0-9_]*\b 首字母只能大寫 Boo Foo
^http:\/\/([\w-]+(\.[\w-]+)+(\/[\w-.\/\?%&=\u4e00-\u9fa5]*)?)?$ 驗證網(wǎng)址 http://www.baidu.com/?id=1
^[\u4e00-\u9fa5]{0,}$ 驗證漢字 漢字漢字
\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 驗證電子郵件 example@163.com
^[1-9]([0-9]{16}|[0-9]{13})[xX0-9]$ 驗證身份證 14525419951215445X
^13[0-9]{1}[0-9]{8}|^15[9]{1}[0-9]{8} 驗證手機號 138459572***
^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]) 驗證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|)$ 驗證域名 baidu.com
^([a-zA-Z]\:|\\)\\([^\\]+\\)*[^\/:*?"<>|]+\.txt(l)?$ 驗證文件路徑 C:\user\wo
<(.*)>(.*)<\/(.*)>|<(.*)\/> HTML標簽匹配(需修改) xxxx
一,必備知識
1.修飾符(flag)

re.I 使匹配對大小寫不敏感
re.L 做本地化識別匹配
re.M 多行匹配,影響^和$
re.S 使.匹配包括換行在內的所有字符
re.U 根據(jù)Unicode字符集解析字符.這個標志影響\w \W \b \B
re.X 該標志通過給予你更靈活的格式以便你將正則表達式寫的更易于理解.
# 例子 result = re.match('^The.*?(\d+).*?phone.', content, re.S)
2.匹配模式


^ 匹配字符串開頭
$ 匹配字符串結尾
. 匹配人以字符,除了換行符號.當re.DOTAALL標記被指定時,則可以匹配包括換行符的任意字符.
[...] 用來表示一組字符,單獨列出:[amk]匹配a,m或k
[^...] 不在[]中的字符:[^amk]匹配除amk之外的字符
re* 匹配0個或多個的表達式
re+ 匹配1個或多個的表達式
re? 匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式.
re{n} 精準匹配n個前面表達式
re{n,} 匹配大于等于n個前面表達式
re{n,m} 匹配n到m個前面的表達式定義的片段,貪婪方式
a|b 匹配a或b
(re) 對正則表達式分組,并記住匹配的文本
(?imx) 正則表達式包含三種可選標志,imx,只影響括號中的區(qū)域.
(?-imx) 正則表達式關閉imx可選標志,只影響括號中的區(qū)域.
(?:re) 類似(...)但不表示一個組
(?imx:re) 在括號中使用imx可選標志
(?-imx:re) 在括號中不是用imx可選標志
(?#...) 注釋
(?=re) 前向肯定界定符.如果所含正則表達式,以...表示,在當前位置成功匹配時成功,否則失敗.但一旦所含表達式已經(jīng)嘗試,匹配引擎根本沒有提高,模式的剩余部分還要嘗試界定符右邊.
(?!re) 前向否定界定符.與肯定界定符相反;當所含的表達式不能在字符串當前位置匹配成功時成功.
(?>re) 匹配的獨立模式,省去回朔.
\w 匹配字符數(shù)字以及下劃線
\W 匹配非字母數(shù)字下劃線
\s 匹配任意空白字符,等價于[\t\n\r\f]
\S 匹配任意非空白字符
\d 匹配任意數(shù)字
\D 匹配任意非數(shù)字
\A 匹配字符串開始
\Z 匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串.
\z 匹配字符串結束
\G 匹配最后匹配完成的位置
\b 匹配一個單詞邊界,也就是指單詞和空格之間的位置
\B 匹配非單詞邊界
\n \t 匹配一個換行符,一個制表符
\1...\9 匹配第n個分組的內容
3. r的作用
- r’(\w+) (\w+)(?P.*)’,字符串之前的r可以避免轉行符混淆
正則表達式使用反斜杠來表示特殊形式,或者把特殊字符轉義成普通字符。
而反斜杠在普通的 Python 字符串里也有相同的作用,所以就產(chǎn)生了沖突。
解決辦法是對于正則表達式樣式使用 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+,也就是至少一個數(shù)字,并沒有指定具體多少個數(shù)字,因此,.*就盡可能匹配多的字符,這里就把12345匹配了,給\d+留下個可滿 足條件的數(shù)字 6.最后得到的內容就只有數(shù)字6了
import re
content = 'The 123456 is my one phone number.'
print('貪婪匹配:')
result = re.match(r'^The.*(\d+).*', content) #使用match匹配, 第一個參數(shù)為正則表達式, 第二個為要匹配的字符串
print(result.group()) #輸出匹配內容
print('result = %s'%result.group(1)) #輸出第一個被()包裹的內容
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.轉義匹配的使用
由于()屬于正則表達式的特殊字符, 因此在需要匹配()時, 需要加上轉義字符\.
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ù)有一個int類型的參數(shù),參數(shù)為0表示返回正則匹配的字符串,參數(shù)為1返回正則中第一個組匹配的內容,2返回第二組的內容一次類推
- groups 函數(shù)是所有group函數(shù)結果組成一個元組。
二,函數(shù)應用
1. re.compile(pattern,flags=0)—自定義匹配模板
- 他的第一個參數(shù)是正則字符串,第二個參數(shù)是修飾符
- 編譯成一個正則表達式對象,可以用于匹配match/search/findall 方法 序列
- 在需要匹配相同正則表達式情況下, 事先定義一個compile可以簡化代碼量, 同時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)—從第一個字符開始匹配
- 該函數(shù)從第一個字符開始匹配,如果第一個對不上,就不可能匹配到數(shù)據(jù)。

- 從第一個字符開始進行匹配,不成功則返回None。
- 一個正則表達式中若有多個()可用group方法輸出,比如:ex_re=re.match(‘(.?)actor(.?)$’),可用ex_re.group()訪問生成的列表,可用ex_re.group(0)訪問第一個括號里的元素。
- pettern 就是正則字符串,如果是通過re.compile方法生成的正則對象.match來調用的話,就不需要這個參數(shù)了,因為正則對象本身就代表了一個正則匹配模式。
- string 就是要進行匹配的目標字符串
- 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)—不固定開始,但是只匹配第一個
- re.search()并不要求必須從字符串的開頭進行匹配如match(),也就是說,正則表達式可以是字符串的一部分。
- 用法基本與match相同,只不過是掃描整個字符串,從一開始匹配到的地方開始。
import re
regex = '<(.*)>(.*)<\/(.*)>|<(.*)\/>'
m = re.search(regex,"aa<a>aaaa</a>")
#一樣只有search能匹配到標簽
if m is not None:
print(m)
print(m.group())
# 結果
# <re.Match object; span=(2, 13), match='<a>aaaa</a>'>
# <a>aaaa</a>
4. re.findall(pattern, string,[, flags])—匹配所有數(shù)據(jù)
- match()和search()都是返回匹配到的第一個內容就結束匹配, findall()是返回所有符合匹配規(guī)則的內容
- 搜索字符串內,以列表形式返回全部能匹配的子串。
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)
#結果
# ['I', 'a', 'm', 's', 'o', 'h', 'a', 'p', 'p', 'y']
# ['I', 'am', 'so', 'happy']
5. finditer(pattern, string,[,flags] )—返回的是匹配到的迭代器對象
與findall()相同,但返回的是一個迭代器。對于每一次匹配,迭代器都能返回一個匹配對象
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ù)正則表達式的模式分隔符,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)—可正則的字符串替換
替換字符串中的某些子串,可以用正則表達式來匹配被選子串。
pattern:表示正則表達式中的模式字符串;
repl:被替換的字符串(既可以是字符串,也可以是函數(shù));
string:要被處理的,要被替換的字符串;
count:匹配的次數(shù), 默認是全部替換
import re
st = "hello 2019"
st = re.sub("([0-9]+)","yudengwu",st)
print(st)
#結果
# hello yudengwu
8. str.replace(old, new,max)—不是re函數(shù),僅用作字符串替換
- 替代字符串中的某一些子串為另一些字符。
- old – 將被替換的子字符串。
- new – 新字符串,用于替換old子字符串。
- max – 可選字符串, 替換不超過 max 次
import re
st = "我喜歡你,喜歡你"
st = st.replace("喜歡","愛",1)
print(st)
# 我愛你,喜歡你
總結
到此這篇關于Python標準庫re的使用舉例的文章就介紹到這了,更多相關Python標準庫re使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
深入理解Python虛擬機中調試器實現(xiàn)原理與源碼分析
本文主要給大家介紹python中調試器的實現(xiàn)原理,通過了解一個語言的調試器的實現(xiàn)原理我們可以更加深入的理解整個語言的運行機制,可以幫助我們更好的理解程序的執(zhí)行,感興趣的可以了解一下2023-04-04
Pandas缺失值填充 df.fillna()的實現(xiàn)
本文主要介紹了Pandas缺失值填充 df.fillna()的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07
Django中更改默認數(shù)據(jù)庫為mysql的方法示例
這篇文章主要介紹了Django中更改默認數(shù)據(jù)庫為mysql的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
PyTorch計算損失函數(shù)對模型參數(shù)的Hessian矩陣示例
這篇文章主要為大家介紹了PyTorch計算損失函數(shù)對模型參數(shù)的Hessian矩陣的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05

