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

01-正則表達(dá)式

正則表達(dá)式就是檢測(cè)字符串是否滿足某種規(guī)則的工具
例如:賬號(hào)是手機(jī)號(hào)/郵箱/多少位由什么東西組成的ect
1.正則語(yǔ)法
2.2.Python對(duì)正則表達(dá)式的支持,提供了一個(gè)內(nèi)置模塊:re
fullmatch(正則表達(dá)式,字符串):判斷字符串是否符合正則表達(dá)式的規(guī)則

  • 匹配任意字符
    匹配一個(gè)字符串爷绘,只有一個(gè)字符并且是任意字符
re_str = r'.'
result = fullmatch(re_str,'a')
print(result)

匹配一個(gè)字符串戏售,有兩個(gè)任意字符

re_str = r'..'
result = fullmatch(re_str,'an')
print(result)

匹配一個(gè)字符串,前三位分別是abc,最后一位是任意字符

re_str = r'abc.'
result = fullmatch(re_str,'abc@')
print(result)
  • \w匹配字母數(shù)字下劃線
    匹配一個(gè)前三分別是abc,最后一位是字母數(shù)字,下劃線其中的一種的字符串
re_str = r'abc\w'
result = fullmatch(re_str,'abc_')
print(result)
  • \W匹配非字母數(shù)字下劃線
    匹配一個(gè)前三分別是abc爵卒,最后一位非字母數(shù)字,下劃線的字符串
re_str = r'abc\W'
result = fullmatch(re_str,'abc_')
print(result)
  • \s匹配空白字符(空白指空格撵彻、回車钓株、制表符等所有你能產(chǎn)生空白的字符)
    匹配一個(gè)字符串,前三個(gè)是字母數(shù)字下劃線中的任意一種陌僵,最后一位是一個(gè)空白字符
re_str = r'\w\w\w\s'
result = fullmatch(re_str,'a1_\t')
print(result)
  • \S匹配非空白字符(空白指空格轴合、回車、制表符等所有你能產(chǎn)生空白的字符)
    匹配一個(gè)字符串碗短,前三個(gè)是字母數(shù)字下劃線中的任意一種受葛,最后一位非空白字符
re_str = r'\w\w\w\S'
result = fullmatch(re_str,'a1_9')
print(result)
  • \d匹配一個(gè)數(shù)字字符
    匹配一個(gè)字符串,前三位是數(shù)字字符,最后一位是任意字符
re_str = r'\d\d\d.'
result = fullmatch(re_str,'151h')
print(result)
  • \D匹配一個(gè)非數(shù)字字符
    匹配一個(gè)字符串总滩,前三位是非數(shù)字字符纲堵,最后一位是任意字符
re_str = r'\d\d\d.'
result = fullmatch(re_str,'acd1')
print(result)
  • \b檢測(cè)是否是單詞邊界(單詞的開(kāi)頭 ,單詞的結(jié)尾闰渔、單詞和單詞之間的標(biāo)點(diǎn)席函,空格ect
    注意:正則中遇到\b,匹配的時(shí)候先不管他冈涧,匹配成功后再回頭看\b的位置是不是邊界向挖。
    匹配一個(gè)字符串,前四位是when第五位是空白炕舵,空白后邊是where,并且第四位n后面是單詞邊界
re_str = r'when\b\swhere'
result = fullmatch(re_str,'when where')
print(result)
  • ^檢測(cè)字符串是否是以給定的正則表達(dá)式,匹配字符串的開(kāi)頭
re_str = r'\d\d\d.'
result = fullmatch(re_str,'151h')
print(result)
re_str = r'^m\d\d'
result = fullmatch(re_str,'m14')
print(result)
  • $檢測(cè)字符串是否以給定的正則表達(dá)式結(jié)束
    匹配一個(gè)字符串a(chǎn)數(shù)字跟畅,并且a數(shù)字是字符串的結(jié)尾
re_str = r'a\d$'
result = fullmatch(re_str,'a2')
print(result)

result = search(re_str,'a9aaa8')
print(result)
  • \B檢測(cè)非單詞邊界
re_str = r'any\Bwhere'
result = fullmatch(re_str,'anywhere')
print(result)
  • []匹配中括號(hào)出現(xiàn)的任意字符
    注意:一個(gè)中括號(hào)只匹配一個(gè)字符
    匹配一個(gè)三位的字符串咽筋,第一位是a或者b或者或者+,后面兩位是數(shù)字
re_str = r'[abc+]\d\d'
result = fullmatch(re_str,'+12')
print(result)
  • -在正則表達(dá)式中的中括號(hào)中的應(yīng)用:如果將減號(hào)放到兩個(gè)字符的中間代表的是誰(shuí)到誰(shuí)徊件。如果想要表示'-'符號(hào)本身奸攻,就放到開(kāi)頭或者末尾
    [1-8]代表的是:12345678
    [-18]或者[18-]代表的是'1','-','8'
    要求一個(gè)字符串中的第一位是1-8中的一個(gè),后面兩位是小寫(xiě)字母
re_str = r'[1-8][a-z][a-z]'
result = fullmatch(re_str,'1bg')
print(result)

re_str = r'[+!-][A-Z]'
result = fullmatch(re_str,'+A',)
result = fullmatch(re_str,'-B',)
result = fullmatch(re_str,'!C',)
print(result)
  • [^字符集]匹配不在[]字符集中的任意一個(gè)字符
    匹配一個(gè)四位的字符串虱痕,第一位不是大寫(xiě)字母也不是數(shù)字睹耐,后三位是abc
re_str = r'[^A-Z\d]abc'
result = fullmatch(re_str,'+abc')
print(result)
    • 匹配0次或者多次
re_str = r'a*b'   # 'b','ab','aab',.....以此類推
result = fullmatch(re_str,'aaaaaaaaaaab')
re_str = r'\d*'
re_str = r'[abc]*'   # 'a','abbccbaababa',''
print(result)
    • 匹配一次或者多次,與* 類似
      判斷一個(gè)字符串是否是無(wú)符號(hào)的正整數(shù)
re_str = r'[1-9]+\d*'
result = fullmatch(re_str,'110')
print(result)
  • 部翘? 匹配0次或者一次
re_str = r'@?\d+'
result = fullmatch(re_str,'@16723')
print(result)
  • 判斷一個(gè)字符串是否是整數(shù)
re_str = r'[+-]?[0-9]\d*'
result = fullmatch(re_str,'0')
print(result)
  • {N}匹配N次,就只有N位字符
re_str = r'\d{3}'
result = fullmatch(re_str,'123')
print(result)
  • {N,} 至少匹配N次
re_str = r'\w{3,}'
result = fullmatch(re_str,'1234sda__')
print(result)
  • {,N} 最多匹配N次
re_str = r'a{,2}b'
result = fullmatch(re_str,'b')
result = fullmatch(re_str,'ab')
result = fullmatch(re_str,'aab')
result = fullmatch(re_str,'aaab')
print(result)
  • {M,N} 匹配至少M(fèi)次硝训,最多N次(M<N)
re_str = r'a{1,2}b'
result = fullmatch(re_str,'ab')
print(result)

注意:次數(shù)相關(guān)的操作,都是約束的次數(shù)符號(hào)前的一個(gè)字符

  • | 分支(相當(dāng)于邏輯運(yùn)算中的or)
    匹配一個(gè)字符串是三個(gè)字母新思,或者是三個(gè)數(shù)字
re_str = r'[A-Za-z]{3}|\d{3}'
re_str1 = r'\d{3}[A-Za-z]{3}|\d{3}'
# \d{3}[A-Za-z]當(dāng)做分支的一個(gè)整體的條件窖梁,|分支的左邊部分是一個(gè)整體,右邊是一個(gè)整體
result = fullmatch(re_str,'abg')
print(result)

正則中分支有短路操作:如果使用|去連接多個(gè)條件夹囚,前面的條件已經(jīng)符合纵刘,就不會(huì)使用后面的條件再去匹配了

練習(xí):寫(xiě)一個(gè)正則表達(dá)式,能夠匹配出字符串中所有的數(shù)字(包括整數(shù)和小數(shù))
# re_str = r'[1-9]\d*[.]?\d*|0[.]\d+'
# result = fullmatch(re_str,'0.12')
# print(result)
str1 = 'absx12.2ss2.03s40,60aas50,asd6.23,952asd'
re_str = r'[\d.]+'
# '\d+[.]\d+' 與'[1-9]\d*'的位置不同荸哟,輸出的結(jié)果也有可能不一樣
result = findall(re_str,str1)
print('======================')
print(result)
  • 分組
    通過(guò)加()來(lái)對(duì)正則條件進(jìn)行分組
    兩位數(shù)字兩位字母出現(xiàn)三次
re_str = r'([a-z]{2}\d{2}){3}'
result = fullmatch(re_str,'as12df52er63')
print(result)
  • 重復(fù)
    可以通過(guò)\數(shù)字來(lái)重復(fù)匹配前面的括號(hào)中匹配的結(jié)果.數(shù)字的值代表前面的第幾個(gè)分組
re_str = r'(\d{2}[A-Z])=%\1\1'
result = fullmatch(re_str,'23B=%23B23B')
print(result)
re_str = r'(\d{2})\+(\w)\1{2}\2'
result = fullmatch(re_str,'12+a1212a')
print('++++++++++++++++++++')
print(result)
  • 捕獲
    按照完整的正則表達(dá)式去匹配假哎,只捕獲()中的內(nèi)容,只有在findall中有效
re_str = r'a(\d{3})b'
result = fullmatch(re_str,'a786b')
print(result)
print(findall(re_str,'a786b'))
# 用戶名由字母數(shù)字下劃線組成的6-20位
user= input('用戶名:')
QQ = input('qq:')
re_str = r'\w{6,20}'
result = fullmatch(re_str,user)
if result == None:
    print('用戶名不合格鞍历,請(qǐng)重新輸入')
else:
    print('用戶名:%s 合格'% user)

# QQ由數(shù)字組成并且第一位不能是0
re_str = r'[1,9]+\d{4,11}'
result = fullmatch(re_str,QQ)
if result == None:
    print('用戶名不合格舵抹,請(qǐng)重新輸入')
else:
    print('用戶名:%s 合格'% QQ)

02-正則中的轉(zhuǎn)義

1.正則表達(dá)式中的轉(zhuǎn)義和字符串中的轉(zhuǎn)義字符沒(méi)有任何關(guān)系,
在Python中的字符串前加r阻止的是字符串的轉(zhuǎn)義堰燎,不能阻止正則表達(dá)式的轉(zhuǎn)義
2.在正則表達(dá)式中掏父,可以通過(guò)在特殊意義的符號(hào)前加\來(lái)表示符號(hào)本身
+ . * ? \ ( ) [ ] ^ $ |
注意:
a. - 號(hào)只有在中括號(hào)中的兩個(gè)字符之間才有特殊的意義
b.如果特殊符號(hào)放到[]中,作為字符集的內(nèi)容秆剪,那么除了- 號(hào)在兩個(gè)字符之間以外赊淑,其他的都不需要轉(zhuǎn)義
c.\ 不管在哪都需要轉(zhuǎn)義爵政,^放到 中括號(hào)的最前需要轉(zhuǎn)義

re_str = r'a\+}'
result = fullmatch(re_str,'a\+')
print(result)

re_str = r'\+a'
result = fullmatch(re_str,'+a')
print(result)

re_str = r'\\w-a'
result = fullmatch(re_str,'\w-a')
print(result)

re_str = r'\(\d{3}'
result = fullmatch(re_str,'(234')
print(result)

re模塊

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

re_str = r'\d+'
re_object = re.compile(re_str)
print(re_object)
# 不轉(zhuǎn)成對(duì)象,調(diào)用相應(yīng)的函數(shù)
re.match(re_str,'78hj')
# 轉(zhuǎn)換成對(duì)象陶缺,調(diào)用相應(yīng)的方法
re_object.fullmatch('78hj')

2.match(正則表達(dá)式钾挟,字符串)和fullmatch
判斷字符串的開(kāi)頭是否能夠和正則表達(dá)式匹配
fullmatch:判斷整個(gè)字符串是否能夠和正則表達(dá)式匹配

re_str = r'abc\d{3}'
result1 = re.match(re_str,'abc234dafdad')
result2 = re.fullmatch(re_str,'abc234')
print(result1)
print(result2)
# a.匹配范圍,匹配結(jié)果字符的下標(biāo)范圍:(起始下標(biāo),結(jié)束下標(biāo))---- 結(jié)束下標(biāo)取不到
print(result2.span())
# 獲取起點(diǎn)
print(result1.start())
# 獲取終點(diǎn)
print(result1.end())

注意:group參數(shù)饱岸,用來(lái)指定分組對(duì)應(yīng)的相應(yīng)的結(jié)果

re_str = r'(\d{3})\+([A-z]{3})'
match1 = re.match(re_str,'123+abcgg')
print(match1)
print(match1.span())
# 在匹配中掺出,獲取第一個(gè)分組的范圍
print(match1.span(1))
# 在匹配中,獲取第二個(gè)分組的范圍
print(match1.span(2))

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

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

# c.獲取被匹配的原字符串
print(match1.string)
  • search(正則表達(dá)式汤锨,字符串)
    在字符串中去查找第一個(gè)滿足正則表達(dá)式的子串,如果找到就返回匹配對(duì)象百框,找不到返回None
search1 = re.search(r'\d+aa','he9aasda 78aadvsf world')
print(search1)
if search1:
    print(search1.span())

練習(xí):使用search將一個(gè)字符串所有的數(shù)字字符串全部找到
’工資10000元闲礼,年齡18歲,身高180铐维,顏值100‘

str1 = '工資10000元柬泽,年齡18歲,身高180嫁蛇,顏值100'
re_str = r'[1-9]\d*'
search1 = re.search(re_str,str1)
while search1:
    print(search1.group())
    end = search1.end()
    str1 = str1[end:]
    search1 = re.search(re_str,str1)
  • split(正則表達(dá)式锨并,字符串)
    按滿足正則表達(dá)式的子串去切割字符串
str1 = '床前明月光,疑是地上霜睬棚。舉頭望明月第煮,低頭思故鄉(xiāng)!'
result = re.split(r'[,抑党。空盼,!]',str1)
result = re.split(r'\W',str1)
print(result)

中文也在\w的范圍內(nèi)

  • sub(正則表達(dá)式新荤,替換字符串揽趾,被替換的字符串)
word = '你丫是傻叉嗎?我草擬大爺?shù)目凉牵現(xiàn)uck you'
result2 = re.sub(r'傻叉|草|大爺|Fuck|傻逼','*',word)
print(result2)
  • findall(正則表達(dá)式篱瞎,字符串)
# 獲取字符串中所有滿足正則表達(dá)式的子串
# 返回值是列表
# 注意:分組中的捕獲效果在這兒有效
result = re.findall(r'\d([a-z])+','數(shù)據(jù)的恐怖殘5and,125name按貸款')
# 取的字符串是正則表達(dá)式最后一個(gè)字符
result1 = re.findall(r'\d([a-z]+)','數(shù)據(jù)的恐怖殘5and,125name按貸款')
# 取的字符串是正則表達(dá)式中的后一個(gè)分組
print(result)
print(result1)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市痒芝,隨后出現(xiàn)的幾起案子俐筋,更是在濱河造成了極大的恐慌,老刑警劉巖严衬,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澄者,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)粱挡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門赠幕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人询筏,你說(shuō)我怎么就攤上這事榕堰。” “怎么了嫌套?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵逆屡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我踱讨,道長(zhǎng)魏蔗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任痹筛,我火速辦了婚禮沫勿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘味混。我一直安慰自己,他們只是感情好诫惭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布翁锡。 她就那樣靜靜地躺著,像睡著了一般夕土。 火紅的嫁衣襯著肌膚如雪馆衔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,785評(píng)論 1 290
  • 那天怨绣,我揣著相機(jī)與錄音角溃,去河邊找鬼。 笑死篮撑,一個(gè)胖子當(dāng)著我的面吹牛减细,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赢笨,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼未蝌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了茧妒?” 一聲冷哼從身側(cè)響起萧吠,我...
    開(kāi)封第一講書(shū)人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桐筏,沒(méi)想到半個(gè)月后纸型,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年狰腌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了除破。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡癌别,死狀恐怖皂岔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情展姐,我是刑警寧澤躁垛,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站圾笨,受9級(jí)特大地震影響教馆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜擂达,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一土铺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧板鬓,春花似錦悲敷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至抄腔,卻和暖如春瓢湃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赫蛇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工绵患, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悟耘。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓落蝙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親暂幼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掘殴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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

  • 1.正則表達(dá)式 1.1定義 正則表達(dá)式就是用來(lái)檢測(cè)字符串是否滿足某種規(guī)則的工具 例如: 1.賬號(hào)是手機(jī)號(hào)/郵箱/多...
    不忘初心_c590閱讀 407評(píng)論 0 0
  • python的re模塊--細(xì)說(shuō)正則表達(dá)式 可能是東半球最詳細(xì)最全面的re教程,翻譯自官方文檔,因?yàn)楣俜轿臋n寫(xiě)的是真...
    立而人閱讀 22,843評(píng)論 4 46
  • Python中的正則表達(dá)式(re) import rere.match #從開(kāi)始位置開(kāi)始匹配,如果開(kāi)頭沒(méi)有則無(wú)re...
    BigJeffWang閱讀 7,061評(píng)論 0 99
  • 初衷:看了很多視頻粟誓、文章奏寨,最后卻通通忘記了,別人的知識(shí)依舊是別人的鹰服,自己卻什么都沒(méi)獲得病瞳。此系列文章旨在加深自己的印...
    DCbryant閱讀 3,993評(píng)論 0 20
  • 說(shuō)到幸福我們總會(huì)想到愛(ài)情套菜,親情亲善,家庭其實(shí)一個(gè)人也可以很幸福 如果你還能扶起一株傾斜的小草如果你還能幫助一只流浪的動(dòng)...
    楊烏那希閱讀 133評(píng)論 0 0