regular expression regex RE 正則表達(dá)式
定義:用來簡(jiǎn)潔表達(dá)一組字符串的表達(dá)式
"PN"
"PYN""PYTN" 正則表達(dá)式表達(dá)這則數(shù)據(jù):
"PYTHN" P(Y|YT|YTH|YTHO)?N
"PYTHON"
正則表達(dá)式的優(yōu)勢(shì):簡(jiǎn)潔 (非常簡(jiǎn)單的表達(dá)字符串的特征搂擦,一行勝千言)
"PY"
"PYY"
"PYYY" 正則表達(dá)式表示:(表示無窮多個(gè))"PYYYY" PY+
......"PYYYYYY......"
某種特點(diǎn)的字符串
"PY"開頭:
后續(xù)存在不多于10個(gè)字符串稳诚, 正則表達(dá)式表示:
后續(xù)字符不能是"P"或"Y" PY[^PY]{0,10}"PYABC" √ "PYKXYZ" ×
正則表達(dá)式是通用的字符串表達(dá)框架
簡(jiǎn)潔表達(dá)一組字符串的表達(dá)式
針對(duì)字符串表達(dá)“簡(jiǎn)潔”和“特征”思想的工具
判斷某字符串的特征歸屬
在文本處理中十分常用(主要應(yīng)用于字符串匹配中)
表達(dá)文本類型的特征(病毒,入侵等)
同時(shí)查找或替換一組字符串
正則表達(dá)式的使用: 編譯:將符合正則表達(dá)式語法的字符串轉(zhuǎn)換成正則表達(dá)式特征
"PN"
"PYN""PYTN" 正則表達(dá)式表達(dá)這則數(shù)據(jù):
"PYTHN" regex= P(Y|YT|YTH|YTHO)?N"PYTHON" 編譯(特征):p = re.compile(regex)
語法:正則表達(dá)式語法由字符和操作符構(gòu)成
常見操作符
.
表示任何單個(gè)字符
[ ]
字符集瀑踢,對(duì)單個(gè)字符給出取值范圍
[abc]表示a,b,c,
[a-z]表示a到z的單個(gè)字符[^ ]
非字符集扳还,對(duì)單個(gè)字符 給出排除范圍
[^abc]表示非a或b或c的單個(gè)字符
*
前一個(gè)字符0次或無限次擴(kuò)展
abc*表示ab,abc丘损,abcc普办,abccc等
+
前一個(gè)字符1次或無限次擴(kuò)展
abc+表示abc,abcc徘钥,abccc等
衔蹲?
前一個(gè)字符0次或1次擴(kuò)展(匹配)
abc?表示ab呈础,abc
|
左右表達(dá)式任意一個(gè)
abc|def表示abc舆驶,def
{m}
擴(kuò)展前一個(gè)字符m次(僅一個(gè)字符)
ab{2}c表示abbc
{m,n}
擴(kuò)展前一個(gè)字符m至n次(含n)
ab{1,2}c表示abc,abbc
^匹配字符串開頭
^abc表示abc且在一個(gè)字符串的開頭
$
匹配字符串結(jié)尾
abc$表示abc且在一個(gè)字符串的結(jié)尾
( )
分組標(biāo)記而钞,內(nèi)部只能使用 | 操作符
(abc)表示abc,(abc|def)表示abc,def
\d
數(shù)字等價(jià)于|0-9|
\D
匹配任意非數(shù)字
\w
單詞字符沙廉,等價(jià)于|A-Za-z0-9_|
匹配字母數(shù)字下劃線
\W
匹配非字母數(shù)字下劃線
\s
匹配任意空白字符,等價(jià)于[\t\n\r\f]
\S
匹配任意非空字符
\A
匹配字符串開始
\Z
匹配字符串結(jié)束臼节,如果存在換行撬陵,只匹配到換行前的結(jié)束字符串
\z
匹配字符串結(jié)束
正則表達(dá)式實(shí)例: 對(duì)應(yīng)字符串
PY[TH]ON "PYTON","PYHON"
PY[^TH]?ON "PYON","PYaON","PYbON","PYcON"...
PY{:3}N (對(duì)大括號(hào)簽的字符重復(fù)0-3次) "PN","PYN","PYYN""PYYYN"
經(jīng)典正則表達(dá)式實(shí)例
^[A_Za-z]+$
由26個(gè)字母組成的字符串
^[A-Za-z0-9]+$
由26個(gè)字母和數(shù)字組成的字符串
^-?\d+$
整數(shù)形式的字符串
^[0-9]*[1-9][0-9]*$
正整數(shù)形式的字符串
[1-9]\d{5}
中國(guó)境內(nèi)郵政編碼,6位
[\u4e00-\u9fa5]
匹配中文字符
\d{3}-\d{8}|\d{4}-\d{7}
國(guó)內(nèi)電話號(hào)碼网缝,010-68913536
匹配IP地址的正則表達(dá)式
IP地址字符串形式的正則表達(dá)式
(IP地址分四段巨税,每段0-255)
\d+.\d+.\d+.\d+
\d{1,3}.\d{1.3}.\d{1,3}.\d{1,3}
精確表示:
0-99 : [1-9]?\d 100-199:1\d{2}
200-249 :2[0-4]\d 250-255: 25[0-5]
(([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5].){3}(1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])
RE庫的基本使用
Re庫是Python的標(biāo)準(zhǔn)庫
import re
正則表達(dá)式的表示類型:
raw string 類型(原生字符串類型:不包含轉(zhuǎn)義符的字符串)(原生字符串與字符串
的不同是在字符串前面+小寫的r)
re庫采用raw string類型表示正則表達(dá)式,表示為:r"text"
例如:郵編:r "[1-9]\d{5}"
注意:當(dāng)正則表達(dá)式包含轉(zhuǎn)義符時(shí):使用raw string
re.search()
在一個(gè)字符串中搜索匹配正則表達(dá)式的第一位置粉臊,返回match對(duì)象
re.match()
從一個(gè)字符串的開始位置起匹配正則表達(dá)式草添,返回match對(duì)象
re.findall()
搜索字符串,以列表類型返回全部能匹配的子串
re.split()
講一個(gè)字符串按照正則表達(dá)式匹配結(jié)果進(jìn)行分割扼仲,返回列表類型
re.finditer()
搜索字符串远寸,返回一個(gè)匹配結(jié)果的迭代類型抄淑,每個(gè)迭代元素是match對(duì)象
re.sub()
在一個(gè)字符串中替換所有匹配正則表達(dá)式的子串,返回替代后的字符串
re.search(pattern,string,flags=0)在一個(gè)字符串中搜索匹配正則表達(dá)式的 第一個(gè)位置驰后,返回match對(duì)象pattern:正則表達(dá)式的字符串或原生字符串表示
string:待匹配字符串
flags:正則表達(dá)式使用時(shí)的控制標(biāo)記
常用標(biāo)記
說明
re.l
忽略正則表達(dá)式的大小寫肆资,[A-Z]能夠匹配小寫字符,
又叫:re.IGNORECASE
re.M
正則表達(dá)式中^操作符能夠?qū)⒔o定的每行當(dāng)作匹配開始
又叫:re.MULTILINE
re.s
正則表達(dá)式中的 . 操作符能夠匹配所有字符倡怎,默認(rèn)匹配除換行外的所有字符
又叫:re.DOTALL
import re
match = re.search(r"[1-9]\d{5}","BIT 100081")
if match:
? ? print(match.group(0)) #打印出匹配的結(jié)果
# 輸出:
100081
re.match(pattern,string,flags=0)
從一個(gè)字符串的的開始位置起匹配正則表達(dá)式迅耘,返回match對(duì)象(參數(shù)與search相同)
import re
#match = re.match(r"[1-9]\d{5}","BIT 100081")
#print(match.group(0)) #從開始匹配并不是我們所要求的的,單單輸出监署,會(huì)報(bào)錯(cuò)
match = re.match(r"[1-9]\d{5}","100081? BIT")
if match:
? ? print(match.group(0))
re.findall (pattern,string,flags=0)
搜索字符串颤专,以列表類型返回全部能匹配的子串 # 類型與上面一樣
import re
Is =re.findall(r"[1-9]\d{5}","BIT100081 YSU100084")
print(Is)
# 輸出:
['100081', '100084']
re.split(pattern,string,maxsplit=0,flags=0)
將一個(gè)字符串按照正則表達(dá)式匹配結(jié)果進(jìn)行分割,返回列表類型
其中三項(xiàng)與其它相同(匹配的部分去掉)
maxsplit :最大分割數(shù)钠乏,剩余部分作為最后一個(gè)元素輸出
import re
Is = re.split(r"[1-9]\d{5}","BIT100081 TSU100084")
print(Is)
# 輸出:
['BIT', ' TSU', '']
# 對(duì)上式子加入maxsplit
import re
Is = re.split(r"[1-9]\d{5}","BIT100081 TSU100084",maxsplit=1)
print(Is) #當(dāng)maxsplit等于栖秕,只是將第一個(gè)給分割了
#輸出:
['BIT', ' TSU100084']
re.finditer(pattern,string,flags=0)
搜索字符串,返回一個(gè)匹配結(jié)果的迭代類型晓避,每個(gè)迭代元素是match對(duì)象
(參數(shù)和第一個(gè)一樣)
import re
for m in re.finditer(r"[1-9]\d{5}","BIT100081 TSU100084"):
? ? if m:
? ? ? ? print(m.group(0))
# 輸出:
100081
100084
re.sub(pattern.repl,string,count=0,flags=0)
在一個(gè)字符串中替換所有匹配正則表達(dá)式的子串簇捍,返回替代換后的字符串(用一個(gè)新的字符串取代正則表達(dá)式匹配的字符串,并與原來的字符串相組合俏拱,返回一個(gè)新的字符串組合)
repl: 替換匹配字符串的字符串
count:匹配的最大替換次數(shù)
import re
Is =re.sub(r"[1-9]\d{5}",":zipcode","BIT100081 TSU100084")
print(Is)
# 輸出:
BIT:zipcode TSU:zipcode
re庫的另一種等價(jià)用法
rst = re.search(r"[1-9]\d{5}","BIT 100081")
函數(shù)式用法:一次性操作
面向?qū)ο笥梅ǎ壕幾g后的多次操做
pat = re.compite(r"[1-9]\d{5}")
rst = pat.search("BIT 100081")
(通過一次編譯暑塑,當(dāng)多次使用時(shí),加快運(yùn)行速度)
regex = re.compile(pattern,flags=0)
將正則表達(dá)式的字符串形式編譯成正則表達(dá)式對(duì)象
(regex才是正則表達(dá)式的表示)
regex.search ()# 這樣引用時(shí)锅必,將參數(shù)去去掉
match對(duì)象
屬性
說明
.string
待匹配的文本
.re
匹配時(shí)使用pattern對(duì)象
.pos
正則表達(dá)式搜索文本的開始位置
.endpos
正則表達(dá)式搜索文本的結(jié)束位置
import re
match = re.search(r"[1-9]\d{5}","BIT 100081")
if match:
? ? print(match.group(0))
# 使用type來檢查type的類型
print(type(match))
# 輸出:
100081
<class 're.Match'>
match對(duì)象的方法:
方法
說明.group(0)
獲得匹配后的字符串
.start()
匹配字符串在原始字符串的開始位置
.end()
匹配字符串在原始字符串的結(jié)束位置
.span()
返回(.start(), .end())元組類型事格,包含兩個(gè)元素
import re
m= re.search(r"[1-9]\d{5}","BIT 100081? TSU100084")
print(m.string)
print(m.re)
#輸出:
BIT 100081? TSU100084
re.compile('[1-9]\\d{5}')? # 這代表在內(nèi)部只有經(jīng)過compile之后的表達(dá)式才是正則表達(dá)式
#
import re
m= re.search(r"[1-9]\d{5}","BIT 100081? TSU100084")
print(m.string)
print(m.re)
print(m.pos)
print(m.endpos)? #最開始的位置到最后的位置
print(m.group(0))? # match對(duì)象只包含一次對(duì)象的結(jié)果,返回的是第一次匹配的結(jié)果
print(m.start())? # 一個(gè)對(duì)象的起始位置
print(m.end())
# 輸出:
BIT 100081? TSU100084
re.compile('[1-9]\\d{5}')
0
21
100081
4
10
Re庫的貪婪匹配和最小匹配
import re
m= re.search(r"PY.*N","PYANBNCNDN")
print(m.group()) # 根據(jù)不同長(zhǎng)度搞隐,會(huì)有4種結(jié)果
# 輸出
PYANBNCNDN? ? # 默認(rèn)貪婪匹配
貪婪匹配:
Re庫默認(rèn)采用貪婪匹配驹愚,即輸出匹配最長(zhǎng)的子串
最小匹配:生成最小匹配
import re
m= re.search(r"PY.*?N","PYANBNCNDN")
print(m.group()) # 根據(jù)不同長(zhǎng)度劣纲,會(huì)有4種結(jié)果
# 輸出
PYAN
操作符
說明
*逢捺?
前一個(gè)字符0次或無限次擴(kuò)展,最小匹配
+癞季?
前一個(gè)字符1次或無限次擴(kuò)展劫瞳,最小匹配
?绷柒?
前一個(gè)字符0次或1次擴(kuò)展柠新,最小匹配
{m,n}?
擴(kuò)展前一個(gè)字符m至n次(含n),最小匹配
想要了解更多:您可以關(guān)注微信公眾號(hào):foryouos