日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

7.17正则表达式与re模块

發(fā)布時間:2024/3/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7.17正则表达式与re模块 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正則表達式

  這里介紹的只是正則的一點點皮毛,如果要詳細了解可以看書《正則指引》

1.re模塊與正則表達式之間的關(guān)系

  (1)正則表達式不是python獨有的,它是一門獨立的技術(shù)

  (2)所有的編程語言都可以使用正則

  (3)但是如果你想在python中使用,你就必須依賴于re模塊

2.正則的作用

  正則就是用來篩選字符串中的特定的內(nèi)容的

3.正則的應(yīng)用場景

  (1)爬蟲

  (2)數(shù)據(jù)分析

  只要是reg...一般情況下都是跟正則有關(guān)

4.正則表達式在線測試工具:http://tool.chinaz.com/regex/

5.如果想匹配具體的內(nèi)容

  那么可以直接寫完整的內(nèi)容,不需要寫正則

6.字符組:[ ]

  在同一個位置可能出現(xiàn)的各種字符組成了一個字符組,在正則表達式中用[ ]表示,字符分為很多類,比如數(shù)字、字母、標點等等,一個字符組里面的表達式都是或的關(guān)系

  如果我們現(xiàn)在要求一個位置只能出現(xiàn)一個數(shù)字,那么這個位置上的字符只能是0、1、2...9這10個數(shù)中的一個,那怎么用正則表達式寫呢

7.字符

  以上每個正則字符只針對單個字符

(1)^與$符連用的情況

  例如:^francis$

  會精準限制匹配的內(nèi)容,兩者中間寫什么,匹配的字符串就必須是什么,多一個也不行少一個也不行

(2)abc|ab的情況

  一定要將長的放在前面,匹配規(guī)則是如果|前面的匹配上了,|后面的就被舍棄了,所以一定要將長的放在前面

(3)\w,\s,\d與\W,\S,\D相反的匹配關(guān)系(對應(yīng)的兩者結(jié)合就是匹配全局)

  [\w\W]、[\s\S]、[\d\D]

(4)\b匹配一個單詞的結(jié)尾

  n\b:要寫上單詞以什么結(jié)尾(此處表示單詞以n結(jié)尾),否則無法匹配

(5)^a、[^a]、[^a-z]

  ^a:如果^直接寫在外面,是限制字符串的開頭,判斷以什么開頭

  [^a]:如果寫在里面,表示除了[ ]內(nèi)寫的字符,其他都要(取反)

(6)分組

  當(dāng)多個正則符號需要重復(fù)多次的時候,或者當(dāng)做一個整體進行其他操作,那么可以寫成分組的形式,分組在正則的語法中就是()

  ([a-z][0-9])*

8.量詞

(1)正則在匹配的時候默認都是貪婪匹配(盡量匹配多的)

?  你可以通過在量詞后面加上一個?,就可以將貪婪匹配變成非貪婪匹配(惰性匹配)

  \d*、\d+、\d?默認是貪婪匹配的

  \d*?、\d+?、\d??修改為多惰性匹配

(2){n}:明確指定個數(shù)

  \d{2}

(3)量詞必須跟在正則符號的后面

  量詞只能夠限制緊挨著它的那一個正則符號

  \s\d*? 這里的量詞*只對\d有效

9.轉(zhuǎn)義符

  (1)在正則表達式中,有很多有特殊意義的是元字符,比如\n和\s等,如果要在正則中匹配正常的"\n"而不是"換行符"就需要對"\"進行轉(zhuǎn)義,變成"\\"

  (2)在python中,無論是正則表達式,還是待匹配的內(nèi)容,都是以字符串的形式出現(xiàn)的,在字符串中\(zhòng)也有特殊的含義,本身還需要轉(zhuǎn)義

  (3)簡便操作,利用r可以讓整個字符串都不再轉(zhuǎn)義(了解:r其實就是real的意思,真實不轉(zhuǎn)義)

?

?10.貪婪匹配與非貪婪匹配

  (1)<.*>:先拿著里面的.*去匹配所有的內(nèi)容,然后再根據(jù)>往回退著找,遇到>即停止

  (2)<.*?>:先拿著?后面的>去匹配符合條件的最少的內(nèi)容,然后把匹配的結(jié)果返回?

  舉例:.*?x

    就是取前面任意長度的字符,直到第一個x出現(xiàn)

re模塊

1.三個必須掌握的方法

(1)findall

import re ret = re.findall('a', 'eva egon yuan') # 第一個參數(shù)是正則表達式,第二個參數(shù)是待匹配的文本內(nèi)容 print(ret) # 返回所有滿足匹配條件的結(jié)果,并且返回的是一個列表,列表中的元素就是正則匹配到的結(jié)果

(2)search

import re ret = re.search('a', 'eva egon yuan') print(ret) # search不會給你直接返回匹配到的結(jié)果,而是給你返回一個對象 print(ret.group()) # 必須調(diào)用group才能看到匹配到的結(jié)果 # 如果字符串沒有匹配,則返回None,并且需要注意的是如果ret是None,再調(diào)用.group()會直接報錯 if ret: # 可以通過if判斷來進行篩選print(ret.group())

  注意:

    search只會依據(jù)正則查一次,只要查到了結(jié)果,就不會再往后查找

    當(dāng)查找的結(jié)果不存在的情況下,調(diào)用group直接報錯

(3)match

import re ret = re.match('a', 'abc') # 同search,不過僅在字符串開始處進行匹配 print(ret) # match不會給你直接返回匹配到的結(jié)果,而是給你返回一個對象 print(ret.group()) # 必須調(diào)用group才能看到匹配到的結(jié)果 # match是從頭開始匹配,如果正則規(guī)則從頭開始可以匹配上,就返回一個對象,需要用group才能顯示 if ret: # 如果沒匹配上就返回None,調(diào)用group()就會報錯,可以通過if判斷來進行篩選print(ret.group())

  注意:

    match只會匹配字符串的開頭部分

    當(dāng)字符串的開頭不符合匹配規(guī)則的情況下,返回的也是None,調(diào)用group也會報錯

2.其他方法

(1)split

import re ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在對''和'bcd'分別按'b'分割 print(ret) # ['', '', 'cd'] 返回的還是列表

(2)sub

import re ret = re.sub('\d', 'H', 'eva3egon4yuan4',1) # 將數(shù)字替換成'H',參數(shù)1表示只替換1個,不寫默認全替換 # sub('正則表達式','新的內(nèi)容','待替換的字符串',n) # 先按照正則表達式查找所有符合該表達式的內(nèi)容,統(tǒng)一替換成'新的內(nèi)容',還可以通過傳參來控制替換的個數(shù) print(ret) # evaHegon4yuan4

(3)subn

import re ret = re.subn('\d', 'H', 'eva3egon4yuan4') # 將數(shù)字替換成'H',返回元組(替換的結(jié)果,替換了多少次) ret1 = re.subn('\d', 'H', 'eva3egon4yuan4',1) # 將數(shù)字替換成'H',還可以通過傳參來控制替換的個數(shù),返回元組(替換的結(jié)果,替換了多少次) print(ret) # 返回的是一個元組 元組的第二個元素代表的是替換的個數(shù)

(4)compile

import re obj = re.compile('\d{3}') # 將正則表達式編譯成為一個正則表達式對象,規(guī)則要匹配的是3個數(shù)字 ret = obj.search('abc123eeee') # 正則表達式對象調(diào)用search,參數(shù)為待匹配的字符串 res1 = obj.findall('347982734729349827384') print(ret.group()) # 結(jié)果 : 123 print(res1) # 結(jié)果 : ['347', '982', '734', '729', '349', '827', '384']

(5)finditer

import re ret = re.finditer('\d', 'ds3sy4784a') # finditer返回一個存放匹配結(jié)果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) # 查看第一個結(jié)果,等價于ret.__next__().group() print(next(ret).group()) # 查看第二個結(jié)果,等價于ret.__next__().group() print([i.group() for i in ret]) # 查看剩余的匹配結(jié)果

3.findall的優(yōu)先級查詢:分組優(yōu)先機制

import re res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023') print(res.group()) print(res.group(1)) # 獲取正則表達式括號闊起來分組的內(nèi)容 print(res.group(2)) # search與match均支持獲取分組內(nèi)容的操作,這個功能跟正則無關(guān)是python的機制 # 而針對findall它沒有g(shù)roup取值的方法,所以它默認就是分組優(yōu)先獲取的結(jié)果 ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com') print(ret) # 結(jié)果:['oldboy'] # 這是因為findall會優(yōu)先把匹配結(jié)果組里的內(nèi)容返回,如果想要匹配結(jié)果,取消權(quán)限即可 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') # ?:取消分組優(yōu)先 print(ret) # ['www.oldboy.com']

4.給某一個正則表達式起別名:?<name>

import re ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>") # 還可以在分組中利用?<name>的形式給分組起名字 # 獲取的匹配結(jié)果可以直接用group('名字')拿到對應(yīng)的值 print(ret.group('tag_name')) # 獲取的匹配結(jié)果可以直接用group('名字')拿到對應(yīng)的值,結(jié)果:h1 print(ret.group()) # 結(jié)果:<h1>hello</h1>

  注意:

    ?P=tag_name相當(dāng)于引用之前正則表達式,并且匹配到的值必須和前面的正則表達式一模一樣

5.split的優(yōu)先級查詢:分組優(yōu)先機制

import re ret=re.split("\d+","eva3egon4yuan") print(ret) #結(jié)果 : ['eva', 'egon', 'yuan'] ret1=re.split("(\d+)","eva3egon4yuan") print(ret1) #結(jié)果 : ['eva', '3', 'egon', '4', 'yuan'] # 會把切除的內(nèi)容保存下來

轉(zhuǎn)載于:https://www.cnblogs.com/francis1/p/11203877.html

總結(jié)

以上是生活随笔為你收集整理的7.17正则表达式与re模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。