day19-正則表達(dá)式

1.正則表達(dá)式

re模塊是python中提供和正則表達(dá)式相關(guān)操作的方法

1)什么是正則表達(dá)式

正則表達(dá)式是用來(lái)描述字符串規(guī)律的一種語(yǔ)法,可以更加方便的解決字符串匹配局服、字符串查找状植、字符串切割等相關(guān)操作

2)正則語(yǔ)法(通用的)

re.fullmatch(正則表達(dá)式浊竟,字符串) - 判斷字符串和正則表達(dá)式是否完全匹配,如果不能匹配返回None

python是將正則表達(dá)式放在引號(hào)中

a.普通字符

如果正則表達(dá)式中出現(xiàn)普通字符津畸,那么這個(gè)字符表示這個(gè)字符本身

# 一個(gè)字符串只有一個(gè)字符振定,并且這個(gè)字符是a
re_str = r'a'
result = re.fullmatch(re_str, 'a')
print(result)

b. . - 匹配任意字符

一個(gè)正則表達(dá)式中的點(diǎn)匹配一個(gè)任意字符

# 一個(gè)字符串有三個(gè)字符,第一個(gè)是a肉拓,最后一個(gè)是b后频,中間是任意字符
re_str = r'a.b'
result = re.fullmatch(re_str, 'a1b')
print(result)

c.\w(了解) - 匹配字母、數(shù)字、下劃線

re_str = r'a\wb'
result = re.fullmatch(re_str, 'a_b')
print(result)

d.\s - 匹配空白字符

空白字符:空格卑惜、回車(\n)膏执、制表符(\t)

re_str = r'abc\s123'
result = re.fullmatch(re_str, 'abc 123')
print(result)
# print(re_str)
# print(r'1\n1')

e.\d - 匹配一個(gè)數(shù)字字符

re_str = r'\d\d\d'
result = re.fullmatch(re_str, '111')
print(result)

f.\W \S \D

\S - 匹配一個(gè)非空白字符
\D - 匹配一個(gè)非數(shù)字字符

re_str = r'a.b\Sc\D'
result = re.fullmatch(re_str, 'asb1c_')
print(result)

g.[字符集] - 匹配字符集中任意一個(gè)字符

注意:一個(gè)[]只能匹配一個(gè)字符
a.[字符集] - 匹配字符集中任意一個(gè)字符,例如:[abc123]露久、[12abc3] ->匹配一個(gè)字符是a或者b或者1或者c或者2或者3
b.[字符1-字符2] - 匹配編碼值在字符1編碼到字符2編碼中的所有字符中的任意一個(gè)(注意:字符1的編碼值必須小于字符2)
數(shù)字字符:[0-9]
小寫字母:[a-z]
大寫字母:[A-Z]
字母:[a-zA-Z]
\w:[a-zA-Z0-9]
中文:[\u4e00-\u9fa5]
例如:[2-8abc]
[0-9abc] -> [\dabc]

re_str = r'a[hello_?]b'
print(re.fullmatch(re_str, 'a?b'))

re_str = r'[a-w]12'
print(re.fullmatch(re_str, 'q12'))

re_str = r'[\dabc]123'
print(re.fullmatch(re_str, '2123'))

h.[^字符集] - 匹配不在字符集中的任意一個(gè)字符

非數(shù)字字符:[^0-9]
非小寫字母:[^a-z]
非字母:[^a-zA-Z]
非中文:[^\u4e00-\u9fa5]

print(re.fullmatch(r'[^123]ab', '4ab'))

3)檢測(cè)字符的符號(hào)

a.\b - 檢測(cè)是否是單詞邊界

單詞邊界 - 生活中凡是可以區(qū)分出兩個(gè)不同單詞的符號(hào)都是單詞邊界更米;空白字符、標(biāo)點(diǎn)符號(hào)等

# 匹配一個(gè)字符串長(zhǎng)度是6毫痕,字符分別是abc123征峦,并且要求c和1之間是單詞邊界
re_str = r'abc\b123'
print(re.fullmatch(re_str, 'abc 123'))

re_str = r'abc \b123'
print(re.fullmatch(re_str, 'abc 123'))

re_str = r'\d\d[a-f]\b'
print(re.fullmatch(re_str, '78d'))

b.\B - 檢測(cè)是否不是單詞邊界

print(re.search(r'\B\d\d\d\b', 'h789jkh890,kj'))

c.^ - 檢測(cè)是否是字符串開(kāi)頭(必須是在[]外面)

re_str = r'^123'
print(re.fullmatch(re_str, '123'))

d.$ - 檢測(cè)是否是字符串結(jié)尾(必須是在[]外面)

re_str = r'abc123$'
print(re.search(r'\d\d$', '哈哈哈67'))

2.正則表達(dá)式

1)控制匹配次數(shù)的符號(hào)

a.* - 匹配0次或多次

普通字符* - 普通字符出現(xiàn)0次或多次;r'a123' -> '123', 'aa123',...
\d
- \d出現(xiàn)0次或多次镇草;'\dabc' -> 'abc', '223abc',...
[字符集]
- [字符集]出現(xiàn)0次或多次;r'[abc]*123' -> 'a123', 'aab123',...

print(re.fullmatch(r'\d*abc', '165abc'))

b.+ - 匹配1次或多次

print(re.fullmatch(r'a+123', 'aa123'))

c.? - 匹配0次或1次

print(re.fullmatch(r'[-+]?\d\d\d', '-123'))

d.{}

{N} - 匹配N次
{M,N} - 匹配M到N次(至少M(fèi)次瘤旨,最多N次)
{M,} - 至少M(fèi)次
{,N} - 最多N次

print(re.fullmatch(r'a{3}', 'aaa'))
print(re.fullmatch(r'\d{3,5}abc', '2313abc'))
# 密碼:6-12的數(shù)字和字母
print(re.fullmatch(r'[\da-zA-Z]{6,12}', 'asjq182hk1'))
print(re.fullmatch(r'a{,3}123', 'aa123'))

2)貪婪和非貪婪

當(dāng)匹配次數(shù)不確定的時(shí)候梯啤,匹配分為貪婪和非貪婪;默認(rèn)都是貪婪的
貪婪 - 在匹配成功的前提下存哲,次數(shù)盡可能多的去匹配
非貪婪 - 在匹配成功的前提下因宇,次數(shù)盡可能少的去匹配(*?,+?,??,{M,N}?,{M,}?,{,N}?)

print(re.search(r'abc*', 'abcccc'))
print(re.search(r'abc*?', 'abccc'))
print(re.search(r'abc\d*', '哈哈哈abc1728311'))
print(re.search(r'abc\d*?', '哈哈哈abc1728311'))

3) | - 分之

正則1|正則2 - 匹配一個(gè)字符串滿足正則1或者正則2

# 寫一個(gè)正則要求匹配到的字符串是3個(gè)數(shù)字或者3個(gè)字母
print(re.fullmatch(r'\d{3}|[a-zA-Z]{3}', '291'))

4)() - 分組

a.做整體操作

re_str1 = r'(\d{3}|[A-Z]{2})abc'
print(re.fullmatch(re_str1, 'KJabc'))

b.重復(fù)內(nèi)容 - 正則中在數(shù)字前加\,用來(lái)重復(fù)前面第幾個(gè)分組匹配到的內(nèi)容(一個(gè)括號(hào)就是一個(gè)分組)

# '123abc123', '234abc234'
re_str2 = r'(\d{3})abc\1{2}'
print(re.fullmatch(re_str2, '000abc000000'))

5)轉(zhuǎn)義符號(hào)

a.轉(zhuǎn)義符號(hào)

指的是為了讓正則中有特殊意義的符號(hào)的意義消失祟偷,而在符號(hào)前加\

re_str3 = r'\d{2}\.\d{2}'
print(re.fullmatch(re_str3, '12.34'))
print(re.fullmatch(re_str3, '12=34'))    # None

b.除了^方法放在[]的最開(kāi)頭察滑,-放在[]中兩個(gè)字符之間,其他單獨(dú)存在有特殊意義的符號(hào)在[]中都是普通字符

例如:+修肠,*贺辰,?,|,.,()等

re_str3 = r'\d{2}[.]\d{2}'
print(re.fullmatch(re_str3, '23=19'))    # None
print(re.fullmatch(re_str3, '23.19'))

3.re模塊的使用

1)compile

compile(正則表達(dá)式) - 根據(jù)正則表達(dá)式創(chuàng)建正則對(duì)象

re_abj = re.compile(r'\d{2}')
re_abj.fullmatch('78')

re.fullmatch(r'\d{2}', '78')

2)匹配

fullmatch(正則表達(dá)式,字符串) - 完全匹配嵌施,讓整個(gè)字符串和正則表達(dá)式進(jìn)行匹配饲化,如果匹配成功返回匹配對(duì)象,否則返回None
match(正則表達(dá)式吗伤,字符串) - 匹配字符串開(kāi)頭吃靠。如果匹配成功返回匹配對(duì)象,否則返回None

re_str = r'\d{3}'
result1 = re.fullmatch(re_str, '879')
print(result1)
result2 = re.match(re_str, '123哈哈哈78')
print(result2)

匹配對(duì)象

result2 = re.match(r'(\d{3})([a-z])abc', '123wabc哈哈哈78')

a.獲取匹配結(jié)果(匹配到的子串)

匹配對(duì)象.group() - 獲取整個(gè)正則表達(dá)式匹配到的結(jié)果
匹配對(duì)象.group(N) - 獲取正則表達(dá)式中第N個(gè)分組匹配到的結(jié)果

print(result2.group())   # 123wabc
print(result2.group(1))  # 123
print(result2.group(2))  # w

b.獲取匹配結(jié)果在原字符串中的范圍 - 返回:(開(kāi)始下標(biāo)足淆,結(jié)束下標(biāo))巢块,結(jié)束下標(biāo)取不到

匹配對(duì)象.span() - 獲取整個(gè)正則表達(dá)式匹配結(jié)果在原字符串中的范圍
匹配對(duì)象.span(N) - 獲取指定分組匹配結(jié)果在原字符串中的范圍

print(result2.span(2))   # (3,4)

c.獲取原字符串

print(result2.string)   # 123wabc哈哈哈78

3)查找

a.搜索

search(正則表達(dá)式,字符串) - 獲取字符串中第一個(gè)滿足正則表達(dá)式的子串巧号;如果有就返回匹配對(duì)象族奢,沒(méi)有返回None

print(re.search(r'\d{3}', 'hhh192hhh879jah'))

b.findall

findall(正則表達(dá)式,字符串) - 獲取字符串中所有滿足正則表達(dá)式的子串丹鸿,返回值是列表歹鱼,列表中的元素就是滿足要求的子串

print(re.findall(r'\d{3}', 'hhh123aka718821jh122'))  # ['123', '718', '821', '122']
# 注意:如果finall中的正則表達(dá)式中有一個(gè)分組;返回列表中的元素只取匹配結(jié)果中分組對(duì)應(yīng)的部分
print(re.findall(r'(\d{3})[a-z]{2}', 'hhh123ak5a718821jh122'))  # ['123', '821']
# 注意:如果正則表達(dá)式中有多個(gè)分組卜高,返回的列表中的元素是元組弥姻,元組中的元素是每個(gè)分組對(duì)應(yīng)的結(jié)果
print(re.findall(r'(\d{3})([a-z]{2})', 'hhh123ak5a718821jh122'))  # [('123', 'ak'), ('821', 'jh')]

c.finditer

finditer(正則表達(dá)式南片,字符串) - 獲取字符串中所有滿足正則表達(dá)式的子串,返回值是迭代器庭敦,迭代器中的元素是匹配對(duì)象

result3 = re.finditer(r'(\d{3})([a-z]{2})', '213as===-891ja=181hj,,')
result3 = list(result3)
print(result3[0].group(1), result3[1].group(2))

4)切割

re.split(正則表達(dá)式疼进,字符串) - 將字符串中所有和正則表達(dá)式匹配的子串作為切割點(diǎn),對(duì)字符串進(jìn)行切割秧廉;返回值是列表

str1 = '假1設(shè)農(nóng)12安;回56復(fù)win,煎熬?jao ,a8h'
print(re.split(r'[,;!.?\s]', str1))

5)替換

re.sub(正則表達(dá)式伞广,字符串1,字符串2) - 將字符串2中所有滿足正則表達(dá)式的子串都替換成字符串1

print(re.sub(r'\d+', '+', str1))  # 假+設(shè)農(nóng)+安;回+復(fù)win,煎熬?jao ,a+h

# re.IGNORECASE 和 re.I   - 表示匹配的時(shí)候忽略大小寫
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疼电,一起剝皮案震驚了整個(gè)濱河市嚼锄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蔽豺,老刑警劉巖区丑,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異修陡,居然都是意外死亡沧侥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門魄鸦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宴杀,“玉大人,你說(shuō)我怎么就攤上這事拾因⊥眨” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵绢记,是天一觀的道長(zhǎng)主经。 經(jīng)常有香客問(wèn)我,道長(zhǎng)庭惜,這世上最難降的妖魔是什么罩驻? 我笑而不...
    開(kāi)封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮护赊,結(jié)果婚禮上惠遏,老公的妹妹穿的比我還像新娘。我一直安慰自己骏啰,他們只是感情好节吮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著判耕,像睡著了一般透绩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天帚豪,我揣著相機(jī)與錄音碳竟,去河邊找鬼。 笑死狸臣,一個(gè)胖子當(dāng)著我的面吹牛莹桅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烛亦,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诈泼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了煤禽?” 一聲冷哼從身側(cè)響起铐达,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎檬果,沒(méi)想到半個(gè)月后瓮孙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汁汗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年衷畦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栗涂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片知牌。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斤程,靈堂內(nèi)的尸體忽然破棺而出角寸,到底是詐尸還是另有隱情,我是刑警寧澤忿墅,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布扁藕,位于F島的核電站,受9級(jí)特大地震影響疚脐,放射性物質(zhì)發(fā)生泄漏亿柑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一棍弄、第九天 我趴在偏房一處隱蔽的房頂上張望望薄。 院中可真熱鬧,春花似錦呼畸、人聲如沸痕支。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卧须。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間花嘶,已是汗流浹背笋籽。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留察绷,地道東北人干签。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拆撼,于是被迫代替她去往敵國(guó)和親容劳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • Python中的正則表達(dá)式(re) import rere.match #從開(kāi)始位置開(kāi)始匹配闸度,如果開(kāi)頭沒(méi)有則無(wú)re...
    BigJeffWang閱讀 7,085評(píng)論 0 99
  • re模塊手冊(cè) 本模塊提供了和Perl里的正則表達(dá)式類似的功能竭贩,不關(guān)是正則表達(dá)式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,010評(píng)論 0 13
  • `>本文是 Jan Goyvaerts 為 RegexBuddy 寫的教程的譯文莺禁,版權(quán)歸原作者所有 在本文中講述了...
    極客圈閱讀 2,083評(píng)論 0 5
  • 本文譯自 制作正則引擎的作者 Jan Goyvaerts 為工具 RegexBuddy 寫的教程版權(quán)歸原作者所有注...
    極客圈閱讀 3,290評(píng)論 0 25
  • 正則表達(dá)式到底是什么東西留量?字符是計(jì)算機(jī)軟件處理文字時(shí)最基本的單位,可能是字母哟冬,數(shù)字楼熄,標(biāo)點(diǎn)符號(hào),空格浩峡,換行符可岂,漢字等...
    獅子挽歌閱讀 2,148評(píng)論 0 9