2018-09-11day17-正則表達(dá)式

一、正則表達(dá)式

正則表達(dá)式就是用來檢測(cè)字符串是否滿足某種規(guī)則的工具
例如:

  • a.賬號(hào)是手機(jī)號(hào)/郵箱/多少位由什么東西組成
  • b.臟話替換成*等....

1.正則語(yǔ)法
2.python對(duì)正則表達(dá)式的支持彼乌,提供了內(nèi)置模塊:re
fullmatch(正則表達(dá)式,字符串):判斷整個(gè)字符串是否符合正則表達(dá)式規(guī)則

1.匹配字符

1) ' . ' 匹配任意字符
# 匹配一個(gè)字符串,前三位分別是abc,最后一位是任意字符
re_str = r'abc.'
result = fullmatch(re_str, 'abc&')
print(result)
2)'\w'匹配字母數(shù)字下劃線
# 匹配一個(gè)字符串,前三位是分別是abc巨柒,最后兩位是字母數(shù)字下劃線
re_str = r'abc\w\w'
result = fullmatch(re_str, 'abc_0')
print(result)
3)'\s'匹配空白字符(空白指空格智嚷、制表符、和回車等所有產(chǎn)生空白的字符)
re_str = r'\w\w\w\s.'
result = fullmatch(re_str, 'a_0 !')
print(result)
4)'\d'匹配一個(gè)數(shù)字字符
# 匹配一個(gè)字符串评姨,前三位是數(shù)字字符,最后一位是任意字符
re_str = r'\d\d\d.'
result = fullmatch(re_str, '202*')
print(result)
5)'\b'檢測(cè)是否是單詞邊界檢測(cè)(單詞的開頭、單詞的結(jié)尾吐句、單詞和單詞之間的標(biāo)點(diǎn)空格等)
# good good study,day day up!
# 注意:正則中遇到\b胁后,匹配的時(shí)候先不管它,匹配成功后再回來看\b的位置是否是個(gè)單詞邊界
# 匹配一個(gè)字符串嗦枢,前四位是when攀芯,第五位是空白,空白后面是where文虏,并且第四位n后面是個(gè)單詞邊界
re_str = r'when\b.where'
result = fullmatch(re_str, 'when,where')
print(result)
6)'^'檢測(cè)字符串是否以給定的正則表達(dá)式開頭
# 匹配一個(gè)字符串侣诺,是否以兩個(gè)數(shù)字符開頭
re_str = r'^\d\d'
result = fullmatch(re_str, '23')
print(result)
7)'$'檢測(cè)字符串是否以給定的正則表達(dá)式結(jié)尾
# 匹配一個(gè)字符串"a數(shù)字",并且"a數(shù)字"的字符串的結(jié)尾
re_str = r'a\d$'
result = fullmatch(re_str, 'a8')
print(result)
8)'\W'匹配一個(gè)非數(shù)字氧秘、字母年鸳、下劃線
9)'\S'匹配非空字符串
10)'\D'匹配非數(shù)字字符
11)'\B'檢測(cè)非單詞邊界

2.匹配次數(shù)

1')[ ]'匹配中括號(hào)中出現(xiàn)的任意字符
# 注意:一個(gè)中括號(hào)只匹配一個(gè)字符
# 匹配一個(gè)3位的字符串,第一位是a或者b或者c丸相,后兩位是數(shù)字
re_str = r'[abc]\d\d'
result = fullmatch(re_str, 'a12')
print(result)

' - '在正則中的中括號(hào)的應(yīng)用:如果將減號(hào)方法兩個(gè)字符的中間代表的是誰(shuí)到誰(shuí)搔确。如果想要表示' - '符號(hào)本身,就放在開頭或結(jié)尾

# 要求一個(gè)字符串中的第一個(gè)是1-8中的一個(gè)灭忠,后面兩位是小寫字母
# [-1-8]:代表字符集是:-12345678
# [-18]或者[18-]:代表的字符集是'1','8','-'
re_str = r'[-1-8][a-z][a-z]'
result = fullmatch(re_str, '-mn')
print(result)
2)[^字符集]匹配不在[]字符集中的任何一個(gè)字符
# 匹配一個(gè)四位的字符串膳算,第一位不是大寫字母或數(shù)字,后三位是abc
re_str = r'[^A-Z\d]abc'
result = fullmatch(re_str, '!abc')
print(result)
3)' * '匹配0次或者多次
# 匹配一個(gè)字符串弛作,最后一位是b涕蜂,b前面有0個(gè)或者多個(gè)a
re_str = r'a*b'   # 'b','ab','aab','aaab'...
result = fullmatch(re_str, 'b')
print(result)

re_str = r'\d*'
re_str = r'[abc]*'
4)' + '匹配一次或者多次(至少一次)
# 判斷一個(gè)字符串是否是無符號(hào)的正整數(shù)
re_str = r'[1-9]+\d*'
print(fullmatch(re_str, '1010'))
5)' ? '匹配0次或者一次
# 判斷一個(gè)字符串是否是整數(shù)
re_str = r'[-+]?[1-9]+\d*'
print(fullmatch(re_str, '-100'))
6)

{N}匹配N次
{N,}至少匹配N次
{,N}最多匹配N次
{M,N} 匹配至少M(fèi)次,最多N次(N>M)

3.分支和分組

1)' | '分支(相當(dāng)于邏輯運(yùn)算中的or)
# \d{3}[a-z]{2}是分支的第一個(gè)條件缆蝉,{A-Z}{3}是分支的第二個(gè)條件
re_str = r'\d{3}[a-z]{2}|[A-Z]{3}'
print(fullmatch(re_str, 'ABC'))

注意:正則中的分支有短路操作宇葱,如果使用|連接多個(gè)條件,前面的條件已經(jīng)匹配出結(jié)果刊头,那么就不會(huì)使用后面的條件再去匹配了

2)分組

a.分組
通過加()來對(duì)正則條件進(jìn)行分組

# 兩位數(shù)字兩位字母出現(xiàn)3次
re_str = r'(\d{2}[a-z]{2}){3}'
print(fullmatch(re_str, '11aa22bb33cc'))

b.重復(fù)
可以通過\數(shù)字來重復(fù)匹配前面的括號(hào)中匹配的結(jié)果

re_str = r'(\d{2})-(\w{2})\1{2}\2'
print(fullmatch(re_str, '12-a_1212a_'))

c.捕獲
按照完整的正則表達(dá)式去匹配黍瞧,只捕獲()中的內(nèi)容,只有在findall中有效

re_str = r'a(\d{2})b'
print(findall(re_str, 'a78b'))

['78']

二原杂、正則中的轉(zhuǎn)義

正則表達(dá)式中的轉(zhuǎn)義和字符串中的轉(zhuǎn)義字符沒有任何關(guān)系印颤。在python中的字符串前加r阻止的是字符串的轉(zhuǎn)義,不能阻止正則表達(dá)式的轉(zhuǎn)義

在正則表達(dá)式中穿肄,可以通過在有特殊意義的符號(hào)前加\來表示符號(hào)本身

\+ \. \* \? \\ \( \) \[ \] \^ \$ \|

注意:
a.-號(hào)只有在中括號(hào)中的兩個(gè)字符之間才有特殊的意義
b.如果特殊符號(hào)放在[]中作為字符集的內(nèi)容年局,那么除了-號(hào)在兩個(gè)字符之間以外,其他的都不需要轉(zhuǎn)義
c.\不管在哪都需要轉(zhuǎn)義

三咸产、re模塊

1.compile(正則表達(dá)式):將正則表達(dá)式轉(zhuǎn)換成正則表達(dá)式對(duì)象

re_str = r'\d+'
re_object = re.compile(re_str)

# 不轉(zhuǎn)成對(duì)象矢否,調(diào)用相應(yīng)的函數(shù)
re.match(re_str, '78s')
# 轉(zhuǎn)換成對(duì)象,調(diào)用相應(yīng)的方法
re_object.match('78r')

2.match(正則表達(dá)式,字符串)和fullmatch

# match:判斷字符串的開頭是否能夠和正則表達(dá)式匹配
# fullmatch:判斷整個(gè)字符串是否能夠和正則表達(dá)式匹配
# 返回值都是匹配結(jié)果脑溢,如果匹配成功返回匹配對(duì)象僵朗,否則返回None
re_str = r'abc\d{3}'
match1 = re.match(re_str, 'abc123abcdef')
match2 = re.fullmatch(re_str, 'abc123')
print(match1)
print(match2)

a.匹配到的范圍。匹配結(jié)果字符的下標(biāo)范圍

print(match1.span())
# 獲取起點(diǎn)
print(match1.start())
# 獲取終點(diǎn)
print(match1.end())

# 注意:group參數(shù),用來指定分組對(duì)應(yīng)的相應(yīng)的結(jié)果
re_str = r'(\d{3})\+([a-z]{2})'
match1 = re.match(re_str, '123+ab123')
print(match1.span())
print(match1.span(1))
print(match1.span(2))

# 在匹配結(jié)果中验庙,獲取第2個(gè)分組的起始下標(biāo)
print(match1.start(2))

b.獲取匹配結(jié)果對(duì)應(yīng)的字符串

re_str = r'(\d{3})\+([a-z]{2})'
match1 = re.match(re_str, '123+ab123')
print(match1.group())
print(match1.group(1))
print(match1.group(2))

123+ab
123
ab

c.獲取被匹配的原字符

re_str = r'(\d{3})\+([a-z]{2})'
match1 = re.match(re_str, '123+ab123')
print(match1.string)

123+ab123

3.search(正則表達(dá)式,字符串):

在字符串中去查找第一個(gè)滿足正則表達(dá)式要求的子串顶吮,如果找到了就返回匹配對(duì)象,否則返回None

search1 = re.search(r'\d+aa', 'hel11aalo wo3aarpld')
print(search1)
if search1:
    print(search1.span())

<_sre.SRE_Match object; span=(3, 7), match='11aa'>
(3, 7)

4.split(正則表達(dá)式,字符串)

按滿足正則表達(dá)式的子串去切割字符串

str1 = '窗前明月光粪薛,疑是地上霜悴了。舉頭望明月,低頭思故鄉(xiāng)违寿!'
result = re.split(r'\W',str1)  # 中文屬于\w范圍
print(result)

['窗前明月光', '疑是地上霜', '舉頭望明月', '低頭思故鄉(xiāng)', '']

5.sub(正則表達(dá)式,替換字符串,被替換字符串)

word = '你是SB嗎湃交,操你大爺?shù)模現(xiàn)uck you'
result = re.sub(r'SB|操|(zhì)Fuck','*',word)
print(result)

你是*嗎陨界,*你大爺?shù)模? you

6.findall(正則表達(dá)式,字符串)

獲取字符串中所有滿足正則表達(dá)式的子串
返回值是列表
注意:分組中的捕獲效果在這兒有效

result = re.findall(r'\d([a-z]+)','北京1beijing,歡迎welcome你2you')
print(result)

['beijing', 'you']
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巡揍,一起剝皮案震驚了整個(gè)濱河市痛阻,隨后出現(xiàn)的幾起案子菌瘪,更是在濱河造成了極大的恐慌,老刑警劉巖阱当,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俏扩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡弊添,警方通過查閱死者的電腦和手機(jī)录淡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來油坝,“玉大人嫉戚,你說我怎么就攤上這事〕喝Γ” “怎么了彬檀?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瞬女。 經(jīng)常有香客問我窍帝,道長(zhǎng),這世上最難降的妖魔是什么诽偷? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任坤学,我火速辦了婚禮,結(jié)果婚禮上报慕,老公的妹妹穿的比我還像新娘深浮。我一直安慰自己,他們只是感情好眠冈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布飞苇。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玄柠。 梳的紋絲不亂的頭發(fā)上突梦,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音羽利,去河邊找鬼宫患。 笑死,一個(gè)胖子當(dāng)著我的面吹牛这弧,可吹牛的內(nèi)容都是我干的娃闲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匾浪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼皇帮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛋辈,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤属拾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后冷溶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渐白,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年逞频,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纯衍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苗胀,死狀恐怖襟诸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情基协,我是刑警寧澤歌亲,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站堡掏,受9級(jí)特大地震影響应结,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泉唁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一鹅龄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亭畜,春花似錦扮休、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蜗搔。三九已至,卻和暖如春八堡,著一層夾襖步出監(jiān)牢的瞬間樟凄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工兄渺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缝龄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓挂谍,卻偏偏與公主長(zhǎng)得像叔壤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子口叙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • python的re模塊--細(xì)說正則表達(dá)式 可能是東半球最詳細(xì)最全面的re教程,翻譯自官方文檔,因?yàn)楣俜轿臋n寫的是真...
    立而人閱讀 22,875評(píng)論 4 46
  • 推薦幾個(gè)正則表達(dá)式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:...
    木易林1閱讀 11,493評(píng)論 9 151
  • 正則表達(dá)式到底是什么東西炼绘?字符是計(jì)算機(jī)軟件處理文字時(shí)最基本的單位,可能是字母妄田,數(shù)字俺亮,標(biāo)點(diǎn)符號(hào),空格形庭,換行符铅辞,漢字等...
    獅子挽歌閱讀 2,147評(píng)論 0 9
  • 我是破繭成峰厌漂,超級(jí)奶爸萨醒,終身學(xué)習(xí)的踐行人,007er苇倡,008er富纸,區(qū)塊鏈?zhǔn)澜绲男W(xué)生,與你一起成長(zhǎng)旨椒,7年后長(zhǎng)成自己...
    破繭成峰閱讀 258評(píng)論 0 0
  • 顏可素晓褪,眼須色;筆隨手综慎,手從心涣仿。 慚愧,這次的習(xí)作花了整整一個(gè)星期示惊。人物還是比較生疏好港,每天伏案兩三個(gè)小時(shí),只能進(jìn)展...
    愛瑋兒閱讀 1,112評(píng)論 42 55