Re庫正則表達(dá)式,知識(shí)點(diǎn)躯嫉,

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辉巡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蕊退,更是在濱河造成了極大的恐慌郊楣,老刑警劉巖憔恳,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異净蚤,居然都是意外死亡钥组,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門今瀑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來程梦,“玉大人,你說我怎么就攤上這事橘荠∮旄剑” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵哥童,是天一觀的道長(zhǎng)挺份。 經(jīng)常有香客問我,道長(zhǎng)贮懈,這世上最難降的妖魔是什么匀泊? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮朵你,結(jié)果婚禮上各聘,老公的妹妹穿的比我還像新娘。我一直安慰自己抡医,他們只是感情好躲因,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著魂拦,像睡著了一般毛仪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芯勘,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天箱靴,我揣著相機(jī)與錄音,去河邊找鬼荷愕。 笑死衡怀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的安疗。 我是一名探鬼主播抛杨,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼荐类!你這毒婦竟也來了怖现?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屈嗤,沒想到半個(gè)月后潘拨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饶号,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年铁追,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茫船。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琅束,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出算谈,到底是詐尸還是另有隱情涩禀,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布濒生,位于F島的核電站埋泵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏罪治。R本人自食惡果不足惜丽声,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望觉义。 院中可真熱鬧雁社,春花似錦、人聲如沸晒骇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洪囤。三九已至徒坡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瘤缩,已是汗流浹背喇完。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剥啤,地道東北人崇猫。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓午笛,卻偏偏與公主長(zhǎng)得像酣倾,于是被迫代替她去往敵國(guó)和親位岔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容