2019-08-13day17總結(jié)正則表達式

一、正則表達式1

from re import fullmatch, search, findall

0.fullmatch
fullmatch(正則表達式, 字符串) - 查看字符串和正則表達式是否匹配,如果不匹配結(jié)果就是None
正則表達式:r'正則語法'

1.什么是正則表達式
正則表達式是處理字符串的工具负甸,通過撥不通的正則符號來描述字符串的規(guī)則

2.正則符號(正則表達式的語法)
1)普通字符 - 除了在正則中有特殊功能和特殊意義的符號以外的字符都算普通字符
普通字符代表字符本身

匹配一個字符串有三個字符,分別是'a', 'b', 'c'

re_str = r'abc'
result = fullmatch(re_str, 'abc')
print(result)

2). - 匹配任意一個字符
一個.只能匹配一個字符

匹配一個字符串長度是8,前三個字符時abc弧轧,后三個字符時123礁遣,中間是兩個任意字符

re_str = r'abc..123'
result = fullmatch(re_str, 'abcwl123')
print(result)

3)\w - 匹配一個數(shù)字斑芜、字母或者_(在ASCII碼表中)
一個\w只能匹配一個字符

匹配一個長度是4的字符串,第一個字符時數(shù)字祟霍、字母杏头、或_,后面是哪個字符是'abc'

re_str = r'\wabc'
result = fullmatch(re_str, '_abc')
print(result)

4)\d - 匹配任意一個數(shù)字字符
匹配一個長度是5 的字符串沸呐,前兩個字符是任意數(shù)字醇王,后面三個是任意字符

re_str = r'\d\d...'
result = fullmatch(re_str, '98lol')
print(result)

5)\s - 匹配任意一個空白字符
空白字符包括:空格、換行崭添、制表符...

result = fullmatch(r'how\sare!', 'how are!')
print(result)

6)\大寫字母
\D - 匹配除了數(shù)字字符以外的任意字符(匹配一個非數(shù)字字符)
\S - 匹配一個非空白字符

re_str = r'\Dabc\S'
result = fullmatch(re_str, 'aabc5')
print(result)

7)[字符集] - 匹配字符集中出現(xiàn)的任意一個字符
注意:一個[]只能匹配一個字符

a.
[abc] - 匹配abc中任意一個字符
[趙錢孫李] - 匹配趙錢孫李中的任意一個字符

匹配一個長度是4的字符串寓娩,第一個字符是1或者3或者3,后面是abc

re_str = r'[137]abc'
print(fullmatch(re_str, '1abc'))

b.
[1-9] - 匹配1到9中的任意一個字符(字符編碼值遞增)
[a-z] - 匹配任意一個小寫字母
[A-Z] - 匹配任意一個大寫字母
[a-zA-Z] - 匹配任意一個字母
[a-zA-Z0-9_] / [A-Za-z0-9_] - 匹配任意一個字母呼渣、數(shù)字或_
[ \t\n] - 匹配任意一個空白字符
[\u4e00-\u9fa5] - 匹配任意一個中文字符

re_str = r'[!-&]abc'
print(fullmatch(re_str, '!abc'))

8)[^字符集] - 匹配不在字符集中的任意一個字符
[^abc] - 匹配任意一個不是a棘伴、b、c的字符

檢測符號
所有的檢測符號都不會影響字符串的長度

1)\b - 檢查是否是單詞邊界
單詞邊界 - 能夠?qū)蓚€單詞隔開并且不會產(chǎn)生歧義的任意符號:空白字符屁置、標(biāo)點符號焊夸、字符串開頭字符串結(jié)尾
how are、how缰犁,are淳地、how-are
匹配規(guī)則:先去掉\b對字符串進行匹配,如果匹配成功再檢查\b所在的位置是否是單詞邊界

2)^ - 檢查^所在位置是否是字符串開頭
注意:這兒的^是在[]外

3)- 檢查所在的位子是否是字符串結(jié)尾

二帅容、正則表達式2

from re import *

控制次數(shù)的符號:字符符號

1.* - 匹配0次或多次
123a* - 123后面a出現(xiàn)0次貨多次
123\d* - 123后面出現(xiàn)0個或者多個任意數(shù)字字符

123[mnxy9]*   - 123

re_str = r'abc0*123'
print(fullmatch(re_str, 'abc123'))

2.+ - 匹配1次或多次

re_str = r'123[abc]+'
print(fullmatch(re_str, '123abcaaaa'))

3.? - 匹配0次或1次

-?123   - 123/-123

re_str = r'_?abc'
print(fullmatch(re_str, '_abc'))

4.{}
1){N} - 匹配N次
a{3} - 匹配三個a, aaa
\d{3} - 匹配三個任意數(shù)字

匹配電話號碼

re_str = r'1[3-9]\d{9}'

2){M,N} - 匹配M到N次(至少M次颇象,最多N次)

匹配密碼:要求是6-12位的字母

re_str = r'[a-zA-Z]{6,12}'

3){M,} - 匹配至少M次

4){,N} - 匹配最多N次

5.貪婪和非貪婪
在匹配次數(shù)不確定的時候,會出現(xiàn)貪婪和非貪婪兩種情況:默認(rèn)情況都是貪婪的并徘。

什么是貪婪:在能夠匹配成功的前提下遣钳,匹配次數(shù)盡可能多

re_str = r'a.+'
print(search(re_str, 'sda====fsjuhfisf54df54d'))
print(search(r'a\d{3,8}', 'dahhfdbja12315456413215'))

什么是非貪婪:在能夠匹配成功的前提下,匹配次數(shù)盡可能少;(在匹配次數(shù)后加?)

*?
+?
??
{M,N}?
{M,}?
{,N}?
print(search(r'a\d{3,8}?', 'dahhfdbja12315456413215'))

分之

  1. |
    正則1|正則2 - 先讓正則1區(qū)匹配麦乞,如果匹配成功就成功蕴茴;匹配失敗再讓正則2去匹配
    (正則1和正則2中只要有一個能夠匹配成功就行)
    練習(xí)1:寫一個正則表達式,匹配一個字符串:abc的前面是兩個數(shù)字或者兩個大寫字母
    23abc姐直,WLabc

方法一:

re_str = r'\d{2}abc|[A-Z]{2}abc'

方法二:
分組
1.() - 將括號里面的內(nèi)容作為一個整體
1)整體操作

r'(\d\d|[A-Z]{2})abc'
2)a8d5d6f8
r'([a-z]\d){4}'

3)分組
a.方便后面分段或者分情況取不同的匹配結(jié)果
b.分組重復(fù):在正則中用\X來重復(fù)前面第X個分組匹配到的內(nèi)容
注意:\X的前面必須有這個分組

re_str = r'abc|123'
print(fullmatch(re_str, 'abc'))
print(fullmatch(re_str, '123'))

轉(zhuǎn)義
1.加
在正則中有特殊功能和特殊意義的符號前加\倦淀,讓這個符號的特殊功能和意義消失

2.加[]
在[]中有特殊意義的符號有兩個:a.^放在開頭 b.-放在兩個字符之間
其他符號包括:.+ ? * $,這些單獨的符號在[]中都表示符號本身

三声畏、re模塊

from re import *

re模塊是python提供的撞叽,專門針對正則表達式應(yīng)用相關(guān)函數(shù)

1.compile(正則表達式) ->將正則表達式轉(zhuǎn)換成正則對象

compile()

2.字符串匹配
fullmatch(正則表達式, 字符串) - 讓正則表達式和字符串完全匹配
match(正則表達式, 字符串) - 匹配字符串開頭
以上兩個方法的結(jié)果:匹配失敗結(jié)果是None姻成,匹配成功返回匹配對象

re_str = r'\d{3}'
print(fullmatch(re_str, '789'))
print(match(re_str, '123dasuidhdihif==='))

1)匹配對象

result = fullmatch(r'(\d{3})=([a-z]{2})', '234=am')
print(result)

a.獲取匹配到的字符串
匹配對象.group() - 獲取整個正則表達式匹配到的字符串,結(jié)果是字符串
匹配對象.group(N) - 獲取整個正則表達式中地N個分組匹配到的字符串

print(result.group())
print(result.group())
print(result.group(1))
print(result.group(2))

b.獲取匹配到的字符串在原字符串中的位置信息
匹配對象.span() ->返回匹配結(jié)果在原字符串中的下標(biāo)范圍:[開始下標(biāo)愿棋,結(jié)束下標(biāo))
匹配對象.span(N) ->返回地N個分組匹配到的結(jié)果在原字符串中的范圍

print(result.span())
print(result.span(2))
start, end = result.span(1)
print(start, end)

c.獲取原字符串
匹配對象.string

print(result.string)

3.查找
1)search(正則表達式, 字符串) - 在字符串中查找第一個滿足正則表達式的子串科展,如果找到了結(jié)果是匹配對象,找不到就是None

result = search(r'\d{3}', '是否234ash==347jsdf')
print(result)

2)findall(正則表達式, 字符串) - 獲取字符串中所有滿足正則表達式的子串糠雨;返回值是一個列表
注意:如果正則表達式中有分組才睹,列表中的匹配結(jié)果只會去分組匹配到的內(nèi)容

result = findall(r'\d{3}[a-z]{2}', '是234hu士大夫345mmks89h-=數(shù)348kl幾十塊的')
print(result)
result = findall(r'(\d{3})([a-z]{2})', '是234hu士大夫345mmks89h-=數(shù)348kl幾十塊的')
print(result)

3)finditer(正則表達式, 字符串) - 獲取字符串中所有滿足正則表達式的子串;返回值是一個迭代器

result = finditer(r'(\d{3})([a-z]{2})', '是234hu士大夫345mmks89h-=數(shù)348kl幾十塊的')
group = []
group1 = []
group2 = []

for i in result:
    group.append(i.group())
    group1.append(i.group(1))
    group2.append(i.group(2))

print(group,group1,group2)

4.切割
split(正則表達式, 字符串) ->將字符串中滿足正則表達式的子串作為切割點隊長字符進行切割甘邀,返回值是一個字符串列表

result = split(r'\d+', '愛好3ja89是電話費889將括號看0===三等獎9數(shù)據(jù)98=的')
print(result)

5.替換

sub(正則表達式, 字符串1 , 字符串2) - 將字符串2中所有滿足正則表達式的子串都替換成字符串1琅攘,返回一個字符串

message = input('評論:')  # 你媽逼,fuck you 鹃答,F(xiàn)UCK!
new_massage = sub(r'媽|fuck|逼', '*', message, flags=IGNORECASE)
print(new_massage)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乎澄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子测摔,更是在濱河造成了極大的恐慌置济,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锋八,死亡現(xiàn)場離奇詭異浙于,居然都是意外死亡,警方通過查閱死者的電腦和手機挟纱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門羞酗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人紊服,你說我怎么就攤上這事檀轨。” “怎么了欺嗤?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵参萄,是天一觀的道長。 經(jīng)常有香客問我煎饼,道長讹挎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任吆玖,我火速辦了婚禮筒溃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沾乘。我一直安慰自己怜奖,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布翅阵。 她就那樣靜靜地躺著烦周,像睡著了一般尽爆。 火紅的嫁衣襯著肌膚如雪怎顾。 梳的紋絲不亂的頭發(fā)上读慎,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天,我揣著相機與錄音槐雾,去河邊找鬼夭委。 笑死,一個胖子當(dāng)著我的面吹牛募强,可吹牛的內(nèi)容都是我干的株灸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼擎值,長吁一口氣:“原來是場噩夢啊……” “哼慌烧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸠儿,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤屹蚊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后进每,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汹粤,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年田晚,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘱兼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡贤徒,死狀恐怖芹壕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情接奈,我是刑警寧澤踢涌,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站鲫趁,受9級特大地震影響斯嚎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挨厚,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一堡僻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疫剃,春花似錦钉疫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽固阁。三九已至,卻和暖如春城菊,著一層夾襖步出監(jiān)牢的瞬間备燃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工凌唬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留并齐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓客税,卻偏偏與公主長得像况褪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子更耻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,499評論 2 348

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

  • 幾個正則表達式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:ht...
  • 正則表達式到底是什么東西测垛?字符是計算機軟件處理文字時最基本的單位,可能是字母秧均,數(shù)字食侮,標(biāo)點符號,空格熬北,換行符疙描,漢字等...
    獅子挽歌閱讀 2,141評論 0 9
  • Python中的正則表達式(re) import rere.match #從開始位置開始匹配,如果開頭沒有則無re...
    BigJeffWang閱讀 7,064評論 0 99
  • 注:本篇文章只為方便查看讶隐,特此保留起胰,如有冒犯,敬請諒解N籽印P濉! 本文目標(biāo) 30分鐘內(nèi)讓你明白正則表達式是什么炉峰,并對它...
    阿杰Alex閱讀 1,479評論 0 10
  • 01.正則基本符號 1.什么是正則表達式 正則表達式就是字符匹配的工具;是由正則符號和普通字符組成畏妖,來匹配不同規(guī)律...
    Gary134閱讀 527評論 0 0