正則表達(dá)式

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

正則表達(dá)式盒刚,也稱為規(guī)則表達(dá)式细诸,英文名稱Regular Expression,我們?cè)诔绦蛑薪?jīng)常會(huì)縮寫(xiě)為regex或者regexp惕它,專門(mén)用于進(jìn)行文本檢索怕午、匹配、替換等操作的一種技術(shù)淹魄。

2. Python中的正則表達(dá)式

2.1 Python中的正則表達(dá)式模塊re

Python提供的正則表達(dá)式處理模塊re郁惜,提供了正則表達(dá)式的處理函數(shù)

2.2 字符串查詢匹配的函數(shù)

函數(shù) 描述
re.match(reg,info) 用于在開(kāi)始位置匹配目標(biāo)字符串info中符合正則表達(dá)式reg的字符,匹配成功會(huì)返回一個(gè)match對(duì)象甲锡,匹配不成功返回None
re.serach(reg,info) 掃描整個(gè)字符串info,使用正則表達(dá)式reg進(jìn)行匹配兆蕉,匹配成功返回匹配的第一個(gè)match對(duì)象,匹配不成功返回None
re.findall(reg,info) 掃描整個(gè)字符串info缤沦,經(jīng)復(fù)核正則表達(dá)式reg的字符串全部提取出來(lái)存放在列表中返回
re.fullmatch(reg,info) 掃描整個(gè)字符串虎韵,如果整個(gè)字符串都包含在正則表達(dá)式表示的范圍中,返回整個(gè)字符串缸废,否則返回None
re.finditer(reg,info) 掃描整個(gè)字符串包蓝,將匹配到的字符包含在一個(gè)可以遍歷的列表中

2.3 字符串拆分替換的函數(shù)

函數(shù) 描述
re.split(reg,string) 使用指定的正則表達(dá)式reg匹配的字符缩多,將字符串string拆分成一個(gè)字符串列表,如:re.split(r”\s+”,info),表示使用一個(gè)或者多個(gè)空白字符串info進(jìn)行拆分养晋,并返回一個(gè)拆分后的字符串列表
re.sub(reg,repl,string) 使用指定的字符串repl來(lái)替換目標(biāo)字符串string中匹配正則表達(dá)式reg的字符

2.4 正則表達(dá)式中的元字符

元字符 描述
^ 表示匹配字符串的開(kāi)頭位置的字符
$ 表示匹配字符串的結(jié)束位置的字符
. 表示匹配任意一個(gè)字符
\d 匹配一個(gè)數(shù)字字符
\D 匹配一個(gè)非數(shù)字字符
\s 匹配一個(gè)空白字符
\S 匹配一個(gè)非空白字符
\w 匹配一個(gè)數(shù)字/字母/下劃線中任意一個(gè)字符
\W 匹配一個(gè)非數(shù)字字母下劃線的任意一個(gè)字符
\d 匹配一個(gè)單詞的邊界
\B 匹配不是單詞的開(kāi)頭或者結(jié)束位置

2.5 實(shí)例

  1. re.match()
import re
info1 = "Hello world,you are beautiful"
info2 = "hello%"
#定義正則表達(dá)式
regStart = r"wow"
#從字符串開(kāi)始位置匹配衬吆,是否包含符合正則表達(dá)式的內(nèi)容
print(re.match(regStart,info1))

  1. re.search
import re
info1 = "Hello world,you are beautiful, you are cute"
info2 = "hello%"
#定義正則表達(dá)式
regStart = r"are"
#掃描整個(gè)字符串,是否包含符合正則表達(dá)式的內(nèi)容绳泉,返回匹配到的第一個(gè)字符串的match對(duì)象
print(re.search(regStart,info1))

#輸出:<_sre.SRE_Match object; span=(16, 19), match='are'>
  1. re.findall()
import re
info1 = "Hello world,you are beautiful, you are cute"
info2 = "hello%"

#定義正則表達(dá)式
regStart = r"are"
#掃描整個(gè)字符串逊抡,是否包含符合正則表達(dá)式的內(nèi)容,返回匹配到的字符串的迭代對(duì)象
print(re.findall(regStart,info1))

#輸出:['are', 'are']

  1. re.fullmatch()
import re
info1 = "Hello world,you are beautiful, you are cute"
info2 = "hello%"
info3 = 'hello'

#定義正則表達(dá)式
regStart = r"are"

#掃描整個(gè)字符串零酪,是否包含符合正則表達(dá)式的內(nèi)容冒嫡,返回匹配到的第一個(gè)字符串的match對(duì)象
print(re.fullmatch(r"\w*",info3))
print(re.fullmatch(r"\w*",info2))

#輸出:<_sre.SRE_Match object; span=(0, 5), match='hello'>
None

2.6 正則表達(dá)式中的詞量

詞量 描述
x* 用于匹配符號(hào)*前面的字符出現(xiàn)0次或者多次
x+ 用于匹配符號(hào)+前面的字符出現(xiàn)1次或者多次
x? 用于匹配符號(hào)?前面的字符出現(xiàn)0次或者1次
x{n} 用于匹配符號(hào){n}前面的字符出現(xiàn)n次
x{m,n} 用于匹配符號(hào){m,n}前面的字符至少出現(xiàn)m次,最多n次
x{n,} 用于匹配符號(hào){n,}前面的字符至少出現(xiàn)n次

2.6.1 實(shí)例

import re
info = "look look!,good gooood!"

#匹配一段字符中出現(xiàn)單詞o字符0次或多次的情況
print(re.findall(r"o*",info))

#匹配一段字符串中出現(xiàn)單詞o字符出現(xiàn)1次或多次的情況
print(re.findall(r"o+",info))

#匹配一段字符串中出現(xiàn)單詞o字符出現(xiàn)0或1次的情況
print(re.findall(r"o?",info))

#匹配字符串中連續(xù)出現(xiàn)2次字符o的情況
print(re.findall(r"o{2}",info))

#匹配字符串中連續(xù)出現(xiàn)2次以上字符o的情況
print(re.findall(r"o{2,}",info))

#匹配字符串中連續(xù)出現(xiàn)2次以上3次以內(nèi)o字符的情況
print(re.findall(r"o{2,3}",info))

#輸出:
['', 'oo', '', '', '', 'oo', '', '', '', '', 'oo', '', '', '', 'oooo', '', '', '']
['oo', 'oo', 'oo', 'oooo']
['', 'o', 'o', '', '', '', 'o', 'o', '', '', '', '', 'o', 'o', '', '', '', 'o', 'o', 'o', 'o', '', '', '']
['oo', 'oo', 'oo', 'oo', 'oo']
['oo', 'oo', 'oo', 'oooo']
['oo', 'oo', 'oo', 'ooo']

2.7 正則表達(dá)式中的范圍匹配

范圍 描述
[0-9] 用于匹配一個(gè)0-9之間的數(shù)字四苇,等價(jià)于\d
[^0-9] 用于匹配一個(gè)非數(shù)字字符孝凌,等價(jià)于\D
[3-6] 用于匹配一個(gè)3-6之間的數(shù)字
[a-z] 用于匹配a-z之間的數(shù)字
[A-Z] 用于匹配一個(gè)A~Z之間的字母
[a-zA-Z] 用于匹配一個(gè)a~z或者A-Z之間的字母,匹配任意一個(gè)字母
[a-zA-Z0-9] 用于匹配一個(gè)字母或者數(shù)字
[a-zA-Z0-9_] 用于匹配一個(gè)字母或者數(shù)字或者下劃線月腋,等價(jià)于\w
[^a-zA-Z0-9_] 用于匹配一個(gè)非字母或者數(shù)字或者下劃線蟀架,等價(jià)于\W

2.7.1 實(shí)例


import re
info = "Hello World_!.The price is 100!"

#匹配字符串中的數(shù)字
print(re.findall(r"[0-9]+",info))
#匹配小寫(xiě)字母
print(re.findall(r"[a-z]+",info))
#匹配大寫(xiě)字母
print(re.findall(r"[A-Z]+",info))
#匹配所有字母
print(re.findall(r"[A-Za-z]+",info))
#匹配小寫(xiě)字母和下劃線
print(re.findall(r"[a-z_]+",info))

#輸出:
['100']
['ello', 'orld', 'he', 'price', 'is']
['H', 'W', 'T']
['Hello', 'World', 'The', 'price', 'is']
['ello', 'orld_', 'he', 'price', 'is']

2.8 正則表達(dá)式中的分組

分組 描述
(expression) 使用圓括號(hào)直接分組;正則表達(dá)式本身匹配的結(jié)果就是一個(gè)組榆骚,可以通過(guò)group()或者group(0)獲绕摹;正則表達(dá)式中包含的圓括號(hào)就是按照順序從1開(kāi)始編號(hào)的小組
(?P<name>expression) 使用圓括號(hào)分組妓肢,然后給當(dāng)前的圓括號(hào)表示的小組命名為name捌省,可以通過(guò)group(name)進(jìn)行數(shù)據(jù)的獲取

2.8.1 實(shí)例


import re

phone = input("請(qǐng)輸入:")
#進(jìn)行正則匹配,得到match對(duì)象碉钠,對(duì)象中包含了分組信息
reg = re.search(r"^(\d{3,4})-(\d{4,8})$", phone)
print(reg)

#匹配結(jié)果為默認(rèn)的組纲缓,可以通過(guò)group()或者group(0)獲取
print(reg.group())
#獲取結(jié)果中第一個(gè)括號(hào)對(duì)應(yīng)的組數(shù)據(jù):處理區(qū)號(hào)
print(reg.group(1))
#獲取第二個(gè)括號(hào)對(duì)應(yīng)的組數(shù)據(jù):處理號(hào)碼
print(reg.group(2))

#輸出:
請(qǐng)輸入:010-6612345
<_sre.SRE_Match object; span=(0, 11), match='010-6612345'>
010-6612345
010
6612345

import re

phone = input("請(qǐng)輸入:")

# 進(jìn)行正則匹配,得到Match對(duì)象,對(duì)象中就包含了命名分組信息
res2 = re.search(r"^(?P<nstart>\d{3,4})-(?P<nend>\d{4,8})$", phone)
# 查看匹配結(jié)果
print(res2)
# 匹配結(jié)果為默認(rèn)的組喊废,可以通過(guò)group()或者group(0)獲取
print(res2.group(0))
# 通過(guò)名稱獲取指定的分組信息:處理區(qū)號(hào)
print(res2.group("nstart"))
# 通過(guò)名稱獲取指定分組的信息:處理號(hào)碼

#輸出:
請(qǐng)輸入:010-6612345
<_sre.SRE_Match object; span=(0, 11), match='010-6612345'>
010-6612345
010

2.9 正則表達(dá)式中的特殊用法

表達(dá)式 描述
(?:expression) 作為正則表達(dá)式的一部分祝高,但是匹配結(jié)果丟棄
(?=expression) 匹配expression表達(dá)式前面的字符,如 "How are you doing" ,正則"(?<txt>.+(?=ing))" 這里取ing前所有的字符操禀,并定義了一個(gè)捕獲分組名字為 "txt" 而"txt"這個(gè)組里的值為"How are you do"
(?<=expression) 匹配expression表達(dá)式后面的字符褂策,如 "How are you doing" 正則"(?<txt>(?<=How).+)" 這里取"How"之后所有的字符横腿,并定義了一個(gè)捕獲分組名字為 "txt" 而"txt"這個(gè)組里的值為" are you doing";
(?!expression) 匹配字符串后面不是expression表達(dá)式字符颓屑,如 "123abc" 正則 "\d{3}(?!\d)"匹配3位數(shù)字后非數(shù)字的結(jié)果
(?<!expression) 匹配字符串前面不是expression表達(dá)式字符,如 "abc123 " 正則 "(?<![0-9])123" 匹配"123"前面是非數(shù)字的結(jié)果也可寫(xiě)成"(?!<\d)123"

2.10 正則表達(dá)式的貪婪模式和懶惰模式

2.10.1 貪婪模式

正則表達(dá)式匹配的一種模式耿焊,速度快揪惦,但是匹配的內(nèi)容會(huì)從字符串兩頭向中間搜索匹配,一旦匹配選中罗侯,就不繼續(xù)向字符串中間搜索了器腋。

2.10.2 懶惰模式

正則表達(dá)式,會(huì)首先搜索匹配正則表達(dá)式開(kāi)始位置的字符,然后逐步向字符串的結(jié)束位置查找纫塌,一旦找到匹配的就返回诊县,然后接著查找

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市措左,隨后出現(xiàn)的幾起案子依痊,更是在濱河造成了極大的恐慌,老刑警劉巖怎披,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胸嘁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凉逛,警方通過(guò)查閱死者的電腦和手機(jī)性宏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)状飞,“玉大人毫胜,你說(shuō)我怎么就攤上這事∥鼙玻” “怎么了指蚁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)自晰。 經(jīng)常有香客問(wèn)我凝化,道長(zhǎng),這世上最難降的妖魔是什么酬荞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任搓劫,我火速辦了婚禮,結(jié)果婚禮上混巧,老公的妹妹穿的比我還像新娘枪向。我一直安慰自己,他們只是感情好咧党,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布秘蛔。 她就那樣靜靜地躺著,像睡著了一般傍衡。 火紅的嫁衣襯著肌膚如雪深员。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天蛙埂,我揣著相機(jī)與錄音倦畅,去河邊找鬼。 笑死绣的,一個(gè)胖子當(dāng)著我的面吹牛叠赐,可吹牛的內(nèi)容都是我干的欲账。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芭概,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赛不!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起罢洲,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俄删,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后奏路,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體畴椰,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年鸽粉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斜脂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡触机,死狀恐怖帚戳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情儡首,我是刑警寧澤片任,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蔬胯,受9級(jí)特大地震影響对供,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氛濒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一产场、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舞竿,春花似錦京景、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至执桌,卻和暖如春鄙皇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鼻吮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工育苟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人椎木。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓违柏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親香椎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漱竖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • python的re模塊--細(xì)說(shuō)正則表達(dá)式 可能是東半球最詳細(xì)最全面的re教程,翻譯自官方文檔,因?yàn)楣俜轿臋n寫(xiě)的是真...
    立而人閱讀 22,877評(píng)論 4 46
  • Python中的正則表達(dá)式(re) import rere.match #從開(kāi)始位置開(kāi)始匹配,如果開(kāi)頭沒(méi)有則無(wú)re...
    BigJeffWang閱讀 7,081評(píng)論 0 99
  • 搞懂Python 正則表達(dá)式用法 Python 正則表達(dá)式 正則表達(dá)式是一個(gè)特殊的字符序列畜伐,它能幫助你方便的檢查一...
    廈熱閱讀 1,582評(píng)論 0 2
  • re模塊手冊(cè) 本模塊提供了和Perl里的正則表達(dá)式類似的功能馍惹,不關(guān)是正則表達(dá)式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,009評(píng)論 0 13
  • (一) 見(jiàn)了好友玛界,經(jīng)她的指點(diǎn)万矾,一下子弄清楚了,書(shū)本上不明白的地方慎框,這個(gè)問(wèn)題困擾了我好幾天良狈,而且我上網(wǎng)查閱了好多資料...
    龍眼花開(kāi)的季節(jié)閱讀 100評(píng)論 0 0