python核心编程第三版(一)学习笔记:正则表达式
注:下面有些內(nèi)容不全都來(lái)源于原著,這些都是通過各方面的資料收集合并的結(jié)果。
目錄
一、正則表達(dá)式介紹
二、分類解析
1、元字符
匹配對(duì)象以及group()和groups()方法
搜索與匹配的比較
2、數(shù)量詞:會(huì)出現(xiàn)貪婪模式
3、邊界詞
4、分組詞
5、特殊構(gòu)造
三、re模塊下的函數(shù)
1、compile:
2、search:
3、match:
4、split:
5、findall:
6、sub:
7、escape:
四、re模塊下函數(shù)的方法
一、正則表達(dá)式介紹
正則表達(dá)式為高級(jí)的文本模式匹配、抽取、與/或文本形式的搜索和替換功能提供了基礎(chǔ)。
這里主要講針對(duì)于python編程中的正則表達(dá)式內(nèi)容,也就是講解re模塊的應(yīng)用,因?yàn)閜ython是通過標(biāo)準(zhǔn)庫(kù)中的re模塊來(lái)支持正則表達(dá)式的。
常見正則表達(dá)式符號(hào)和特殊字符(后面會(huì)針對(duì)這些做一些練習(xí)題)
| 符號(hào) | 描述 | 示例 |
| Literal | 匹配文本字符串的字面值literal | Foo |
| re1| re2 | 匹配正則表達(dá)式re1或者re2 | foo|bal |
| .(點(diǎn)) | 匹配任何字符(除了\n之外) | b.b |
| ^ | 匹配字符串的起始部分 | ^Dear |
| $ | 匹配字符串的終止部分 | /bin/*sh$ |
| * | 匹配0次或多次前面出現(xiàn)的正則表達(dá)式 | [A-Za-z0-9]* |
| + | 匹配1次或多次前面出現(xiàn)的正則表達(dá)式 | [a-z]+\.com |
| ? | 匹配0次或1次前面出現(xiàn)的正則表達(dá)式 | goo? |
| {N} | 匹配N次前面出現(xiàn)的正則表達(dá)式 | [0-9]{3} |
| {M,N} | 匹配M~N次前面出現(xiàn)的正則表達(dá)式 | [0-9]{3,5} |
| [...] | 匹配來(lái)自字符集的任意單一字符 | [aeiou] |
| [..x-y..] | 匹配x~y范圍中的任意單一字符 | [0-9],[a-z] |
| [^...] | 不匹配此字符集中出現(xiàn)的任何一個(gè)字符,包括某一范圍內(nèi)的字符(不包括此字符集中出現(xiàn)) | [^aeiou] |
| (*|+|?|{})? | 用于匹配上面頻繁出現(xiàn)/重復(fù)出現(xiàn)符號(hào)的非貪婪版本(*、+、?、{}) | .*?[a-z] |
| (...) | 匹配封閉的正則表達(dá)式然后另存為子組 | ([0-9]{3})?,f(oo|u)bar |
| 特殊字符 | ? | ? |
| \d | 匹配任何十進(jìn)制數(shù)字,與[0-9]一致(\D與\d相反,不匹配任何非數(shù)值型的數(shù)字) | data\d+.txt |
| \w | 匹配任何字母數(shù)字字符,與[A-Za-z0-9]相同(\W與之相反) | [A-Za-z]\w+ |
| \s | 匹配任何空格字符,與[\n\t\r\v\f]相同(\S與之相反) | of\sthe |
| \b | 匹配任何單詞邊界(\B與之相反) | \bThe\b |
| \N | 匹配已保存的子組N(參見上面的(...)) | price:\14 |
| \c | 逐字匹配任何特殊字符c(即,僅按字面意思匹配,不匹配特殊含義) | \.,\\,\* |
| \A(\Z) | 匹配字符串的起始(結(jié)束)(另見上面的^和$) | \ADear |
| 擴(kuò)展表示法 | ? | ? |
| (?iLmsux) | 在正則表達(dá)式中嵌入一個(gè)或者多個(gè)特殊“標(biāo)記“參數(shù)(或者通過函數(shù)/方法) | (?x),(? Im) |
| (?...) | 表示一個(gè)匹配不用保存的分組 | (?:\w+\.)* |
| (?p<name>...) | 像一個(gè)僅由name標(biāo)識(shí)而不是數(shù)字ID標(biāo)識(shí)的正則分組匹配 | (?p<data>) |
| (?P=name) | 在同一字符串中匹配由(?p<name)分組的之前文本 | (?p=data) |
| (?#...) | 表示注釋,所有內(nèi)容都被忽略 | (?#comment) |
| (?=...) | 匹配條件是如果...出現(xiàn)在之后的位置,而不適用輸入字符串;稱作正向前視斷言 | (?=.com) |
| (?!...) | 匹配條件是如果...不出現(xiàn)之后的位置,而不使用輸入字符串;稱作負(fù)向前視斷言 | (?!.net) |
| (?<=...) | 匹配條件是如果...出現(xiàn)在之前的位置;而不使用輸入字符串;稱作正向后視斷言 | (?<=800-) |
| (?<!...) | 匹配條件是如果...不出現(xiàn)在之前的位置,而不使用輸入字符串;稱作負(fù)向后視斷言 | (?<!192\.168\.) |
| (?(id/name)Y|N) | 如果分組所提供的id或name存在,就返回正則表達(dá)式的條件匹配Y,如果不存在就返回N;|N是可選項(xiàng) | (?(1)y|x) |
二、分類解析
1、元字符
| 字符 | ???????? 描述 |
| . | 除換行符外的任意字符 |
| \ | 轉(zhuǎn)義字符 |
| [...] | 字符集合 |
| \d | 數(shù)字:[0-9] |
| \D | 非數(shù)字[^0-9] |
| \s | 空白字符[\t\r\n\f、空格] |
| \S | 非空白字符[^\s] |
| \w | 單詞字符[A-Za-z0-9] |
| \W | 非單詞字符[^\w] |
匹配對(duì)象以及group()和groups()方法
當(dāng)處理正則表達(dá)式時(shí)。除了正則表達(dá)式對(duì)象之外,還有另一個(gè)對(duì)象類型:匹配對(duì)象(成功調(diào)用match或search返回的對(duì)象)。匹配對(duì)象有兩個(gè)重要的方法:group()和groups()。
group()要么返回整個(gè)匹配對(duì)象,要么根據(jù)要求返回特定子組。
groups()則僅返回一個(gè)包含唯一或者全部子組的元組。
如果沒有子組的要求,group()仍然返回整個(gè)匹配對(duì)象,groups()返回一個(gè)空元組。
不明白的轉(zhuǎn): group 與 groups的區(qū)別
# "\"轉(zhuǎn)義符 >>> import re >>> pat = re.compile("\.") >>> pat.search("ac.efg").group() '.' #匹配到. >>> pat.findall("ac.efg") ['.'] #不用group,返回列表 >>>關(guān)于re模塊在創(chuàng)建模式對(duì)象(compile)后的常用函數(shù)會(huì)在后面詳細(xì)講解
# "[...]" : 集合,匹配里面的任意一個(gè)元素 >>> import re >>> pat = re.compile("[abc]") >>> pat.match("axbycz").group() 'a' >>> pat.search("axbycz").group() 'a' >>> pat.findall("axbycz") ['a', 'b', 'c'] >>> # "\d" : 數(shù)字 >>> import re >>> pat = re.compile("\d") >>> pat.search("ax1by2cz3").group() '1' #搜索到第一個(gè)數(shù)字:1,返回 >>> pat.match("ax1by2cz3").group() Traceback (most recent call last): #匹配不到(首個(gè)不是數(shù)字)返回None,報(bào)錯(cuò),match匹配字符串頭File "<pyshell#4>", line 1, in <module>pat.match("ax1by2cz3").group() AttributeError: 'NoneType' object has no attribute 'group' >>> >>> pat.findall("ax1by2cz3") #匹配所有的數(shù)字,列表返回 ['1', '2', '3']搜索與匹配的比較
python主要有兩種方法完成模式匹配:搜索、匹配
搜索,search()實(shí)現(xiàn)在字符串任意部分中搜索匹配的模式
匹配,match()實(shí)現(xiàn)判斷一個(gè)字符串能否從起始處全部或者部分地匹配某個(gè)模式
# "\D" : 非數(shù)字 >>> import re >>> pat = re.compile("\D") >>> pat.match("ax1by2cz3").group() 'a' >>> pat.search("ax1by2cz3").group() 'a' >>> pat.findall("ax1by2cz3") ['a', 'x', 'b', 'y', 'c', 'z'] # "\s" :空白字符有4,包括: \t、\r、\n、空格 >>> import re >>> pat = re.compile("\s") >>> pat.findall("\rax1 \nby2 \tcz3") ['\r', ' ', '\n', ' ', '\t'] >>> pat.search("\rax1 \nby2 \tcz3").group() '\r' >>> pat.match("\rax1 \nby2 \tcz3").group() '\r' # "\S" :非空白字符 >>> import re >>> pat = re.compile("\S") >>> pat.search("\rax1 \nby2 \tcz3").group() 'a' >>> pat.findall("\rax1 \nby2 \tcz3") ['a', 'x', '1', 'b', 'y', '2', 'c', 'z', '3'] # "\w" :單詞字符,數(shù)字和字母:[A-Za-z0-9] >>> import re >>> pat = re.compile("\w") >>> pat.findall("1a2b3c") ['1', 'a', '2', 'b', '3', 'c'] >>> pat.search("1a2b3c").group() '1' >>> pat.match("1a2b3c").group() '1' # "\W":非單詞字符,除數(shù)字和字母外 >>> import re >>> pat = re.compile("\W") >>> pat.findall("1a2我b3c") [] >>> pat.findall("1a2我b3c,4essa.") [',', '.'] >>> pat.search("1a2我b3c,4essa.").group() ','2、數(shù)量詞:會(huì)出現(xiàn)貪婪模式
| 數(shù)量詞 | ????????????? 描述 |
| * | 匹配前一個(gè)字符0次或則多次 |
| + | 匹配前一個(gè)字符1次或則多次 |
| ? | 匹配前一個(gè)字符0次或則1次 |
| {m} | 匹配前一個(gè)字符m次 |
| {m,n} | 匹配前一個(gè)字符m次到n次 |
| 數(shù)量詞? | 非貪婪模式 |
3、邊界詞
| 邊界詞 | ????????? 描述????? |
| ^ | 匹配字符串開頭和行首 |
| $ | 匹配字符串結(jié)尾和行尾 |
| \A | 匹配字符串開頭 |
| \Z | 匹配字符串結(jié)尾 |
| \b | 匹配\w 和 \W 之間 |
compile中的r表示其后的字符串按原樣表示,不使用轉(zhuǎn)義字符,如:
"\n" 表示換行符
r"\n" 表示一個(gè)斜杠加上字符n組成的字符串
\b此處不明白請(qǐng)轉(zhuǎn):正則表達(dá)式里\b和\B,Python實(shí)例
4、分組詞
| 分組方法 | 描述 |
| | | 左右表達(dá)式任意匹配一個(gè),先匹配左邊一旦成功則跳過匹配右邊, |
| ? (...) | 分組匹配,從左到右,每遇到一個(gè) ( 編號(hào)+1,分組后面可加數(shù)量詞 |
| (?P<name>...) | 除了分組序號(hào)外,指定一個(gè) name的別名 |
| \<number> | 引用編號(hào)為<number>的分組匹配到的字符串 |
| (?P=name) | 引用別名為<name>的分組匹配到的串 |
5、特殊構(gòu)造
| 方法 | 描述 |
| (?:...) | (...)不分組版本,用于使用 | 或者后接數(shù)量詞 |
| (?iLmsux) | iLmsux的每個(gè)字符代表一個(gè)匹配模式,只能用在正則表達(dá)式的開頭,可選多個(gè) |
| (?#...) | #號(hào)后的內(nèi)容將作為注釋 |
| (?=...) | 之后的字符串內(nèi)容需要匹配表達(dá)式才能成功匹配 |
| (?!...) | 之后的字符串不匹配表達(dá)式才能成功 |
| (?<=...) | 之前的字符串需要匹配表達(dá)式才能成功 |
| (?<!...) | 之前的字符串需要不匹配表達(dá)式才能成功 |
| (?(id/name) yes |no) | 如果編號(hào)為id/名字為name的組匹配到字符串,則需要匹配yes,否則匹配no,no可以省略 |
?
?
?
?
?
?
?
?
?
?
# "(?:...)" :()里面有?:表示該()不是分組 >>> import re >>> pat = re.compile(r"a(?:bc)") >>> pat.findall('abc') ['abc'] >>> pat.match('abc').groups() #顯示不出分組 () # "(?=...)":匹配...表達(dá)式,返回。對(duì)后進(jìn)行匹配,總是對(duì)后面進(jìn)行匹配 >>> import re >>> pat=re.compile(r'\w(?=\d)') #匹配表達(dá)式\d,返回?cái)?shù)字的前一位,\w:單詞字符[A-Za-z0-9] >>> pat.findall('abc1 def1 xyz1') ['c', 'f', 'z'] >>> pat.findall('zhoujy20130628hangzhou') #匹配數(shù)字的前一位,列表返回 ['y', '2', '0', '1', '3', '0', '6', '2'] >>> >>> pat=re.compile(r'\w+(?=\d)') >>> pat.findall('abc1,def1,xyz1') #匹配最末數(shù)字的前字符串,列表返回 ['abc', 'def', 'xyz'] >>> pat.findall('abc21,def31,xyz41') ['abc2', 'def3', 'xyz4'] >>> pat.findall('zhoujy20130628hangzhou') ['zhoujy2013062'] >>> import re >>> pat=re.compile(r'[A-Za-z]+(?=\d)') #[A-Za-z],匹配字母,可以用其他的正則方法 >>> pat.findall('zhoujy20130628hangzhou123') #匹配后面帶有數(shù)字的字符串,列表返回 ['zhoujy', 'hangzhou'] >>> pat.findall('abc21,def31,xyz41') ['abc', 'def', 'xyz'] >>> # "(?!...)" 不匹配...表達(dá)式,返回。對(duì)后進(jìn)行匹配 >>> import re >>> pat=re.compile(r'[A-Za-z]+(?!\d)') #[A-Za-z],匹配字母,可以用其他的正則方法 >>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310') ['zhouj', 'hangzho', 'binjian'] #匹配后面不是數(shù)字的字符串,列表返回 >>> pat.findall('abc21,def31,xyz41') ['ab', 'de', 'xy'] >>> # "(?<=...)":匹配...表達(dá)式,返回。對(duì)前進(jìn)行匹配,總是對(duì)前面進(jìn)行匹配 >>> import re >>> pat=re.compile(r'(?<=\d)[A-Za-z]+') #匹配前面是數(shù)字的字母 >>> pat.findall('abc21,def31,xyz41') [] >>> pat.findall('1abc21,2def31,3xyz41') ['abc', 'def', 'xyz'] >>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310') ['hangzhou'] >>> # "(?<!...)":不匹配...表達(dá)式,返回。對(duì)前進(jìn)行匹配,總是對(duì)前面進(jìn)行匹配 >>> import re >>> pat=re.compile(r'(?<!\d)[A-Za-z]+') #匹配前面不是數(shù)字的字母 >>> pat.findall('abc21,def31,xyz41') ['abc', 'def', 'xyz'] >>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310') ['zhoujy', 'angzhou', 'binjiang'] >>> #"(?(id\name) yes |no)": 組是否匹配,匹配返回 >>> import re #no省略了,完整的是a\dbc\d ==> a2bc3,總共5位,第2位是可有可無(wú)的數(shù)字,第5位是數(shù)字 >>> pat=re.compile(r'a(\d)?bc(?(1)\d)') >>> pat.findall('abc9') [''] #返回組1,但第2位(組1)沒有,即返回了'' >>> pat.findall('a8bc9') #完整的模式,返回組1 ['8'] >>> pat.match('a8bc9').group() 'a8bc9' >>> pat.match('a8bc9').group(1) '8' >>> pat.findall('a8bc') [] >>> #"(?iLmsux)":這里就介紹下i參數(shù):大小寫區(qū)分匹配 >>> import re >>> pat=re.compile(r'abc') >>> pat.findall('abc') ['abc'] >>> pat.findall('ABC') [] >>> pat=re.compile(r'(?i)abc') #(?i) 不區(qū)分大小寫 >>> pat.findall('ABC') ['ABC'] >>> pat.findall('abc') ['abc'] >>> pat.findall('aBc') ['aBc'] >>> pat.findall('aBC') ['aBC'] >>> >>> pat=re.compile(r'abc',re.I) #re.I 作為參數(shù)使用,同上作用,推薦 >>> pat.findall('aBC') ['aBC'] >>> pat.findall('abc') ['abc'] >>> pat.findall('ABC') ['ABC']三、re模塊下的函數(shù)
| ?????????? 函數(shù) | ??????????? 描述 |
| compile(pattern) | 創(chuàng)建模式對(duì)象 |
| search(pattern,string) | 在字符串中尋找模式 |
| match(pattern,string) | 在字符串開始處匹配模式 |
| split(pattern,string) | 根據(jù)模式分割字符串 |
| findall(pattern,string) | 列表形式返回匹配項(xiàng) |
| sub(pat,repl,string) | pat匹配想用repl替換 |
| escape(string) | 特殊字符轉(zhuǎn)義 |
1、compile:
>>> import re >>> pat = re.compile("A") >>> m = pat.search("CBA") >>> print(m) #匹配到了,返回MatchObject(匹配對(duì)象)(True) <_sre.SRE_Match object; span=(2, 3), match='A'> >>> m = pat.search("CBD") >>> print(m) #沒有匹配到,返回None(False) None >>> #上面的等價(jià)于,但推薦都用第一種方法,因?yàn)閷⒄齽t表達(dá)式轉(zhuǎn)換為模式對(duì)象,實(shí)現(xiàn)更有效率的匹配,其他的函數(shù)會(huì)在內(nèi)部進(jìn)行轉(zhuǎn)換。 >>> re.search("A","CBA") <_sre.SRE_Match object; span=(2, 3), match='A'> >>>2、search:
>>> import re >>> m = re.search('asd','ASDasd') >>> print(m) <_sre.SRE_Match object; span=(3, 6), match='asd'> #匹配到了,返回MatchObject(True) >>> m = re.search('asd','ASDASD') >>> print(m) #沒有匹配到,返回None(False) None >>>3、match:
>>> import re >>> m = re.match('a','Aasd') >>> print(m) None >>> m = re.match('a','aASD') >>> print(m) <_sre.SRE_Match object; span=(0, 1), match='a'>4、split:
>>> import re >>> re.split(",","a,s,d,asd") ['a', 's', 'd', 'asd'] #返回列表 #等價(jià)于上 >>> pat = re.compile(',') >>> pat.split('a,s,d,asd') ['a', 's', 'd', 'asd'] >>> >>> re.split("[, ]+","a , s ,d ,,,,,asd") #正則匹配:[, ]+ ['a', 's', 'd', 'asd'] >>> re.split("[, ]+","a , s ,d ,,,,,asd",maxsplit=2) # maxsplit 最多分割次數(shù) ['a', 's', 'd ,,,,,asd'] >>> #說(shuō)明:根據(jù)模式的匹配項(xiàng)來(lái)分割字符串,類似字符串的split 的方法,但是字符串的split只能用固定長(zhǎng)度的分割符,而re.split允許用任意長(zhǎng)度和個(gè)數(shù)的分割符。5、findall:
>>> import re >>> re.findall("a","ASDaDFGAa") ['a', 'a'] #列表形式返回匹配到的字符串 >>> pat = re.compile('a') >>> pat.findall('ASDaDFGAa') ['a', 'a'] >>> pat = re.compile('[A-Z]+') >>> pat.findall('ASDcDFGAa') ['ASD', 'DFGA']#說(shuō)明:列表形式返回給定模式的匹配項(xiàng)。返回所有匹配的字符串。6、sub:
#通過組進(jìn)行更新替換: >>> import re >>> re.sub("a","A","abcasd") 'AbcAsd' >>> pat = re.compile("a") >>> pat.sub("A","abcasd") 'AbcAsd' >>> >>> pat=re.compile(r'www\.(.*)\..{3}') >>> pat.match('www.dxy.com').group(1) 'dxy' #通過正則匹配找到符合規(guī)則的”www.dxy.com“ ,取得組1字符串 去替換 整個(gè)匹配得到字符串。dxy -> www.dxy.com >>> pat.sub(r'\1','hello,www.dxy.com') 'hello,dxy' >>> pat=re.compile(r'(\w+) (\w+)') >>> s='hello world ! hello hz !' >>> pat.findall('hello world ! hello hz !') [('hello', 'world'), ('hello', 'hz')] #通過正則得到組1(hello),組2(world),再通過sub去替換。即組1替換組2,組2替換組1,調(diào)換位置。 >>> pat.sub(r'\2 \1',s) 'world hello ! hz hello !'#說(shuō)明:使用給定的內(nèi)容替換掉找到的字符串。a->A7、escape:
#轉(zhuǎn)義 >>> import re >>> re.escape("www.dxy.cn") 'www\\.dxy\\.cn'#說(shuō)明:對(duì)字符串里面的特殊字符串進(jìn)行轉(zhuǎn)義。四、re模塊下函數(shù)的方法
>>> import re >>> pat = re.compile('a') >>> dir(pat) ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn'] >>>?
| ?方法 | ????????????? 描述 |
| group | 獲取子模式(組)的匹配項(xiàng) |
| start | 給定組匹配項(xiàng)的開始位置 |
| end | 給定組匹配項(xiàng)的結(jié)束位置 |
| span | 給定組匹配項(xiàng)的開始結(jié)束位置 |
五、正則表達(dá)式應(yīng)用場(chǎng)景練習(xí)
1、匹配一行文字中的所有開頭的字母內(nèi)容
>>> import re >>> s = "i love you not because of who you are, but because of who i am when i am with you" >>> pat = re.compile(r"\b\w") >>> pat.findall(s) ['i', 'l', 'y', 'n', 'b', 'o', 'w', 'y', 'a', 'b', 'b', 'o', 'w', 'i', 'a', 'w', 'i', 'a', 'w', 'y']2、匹配一行文字中的所有開頭的數(shù)字內(nèi)容
>>> import re >>> s = "i love you not because 12sd 34er 56df e4 54434" >>> pat = re.compile(r"\b\d") >>> pat.findall(s) ['1', '3', '5', '5']3、提取每行中完整的年月日和時(shí)間字段
>>> import re >>> s = """se234 1987-02-09 07:30:001987-02-10 07:25:00""" >>> pat = re.compile(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}") >>> pat.findall(s) ['1987-02-09 07:30:00', '1987-02-10 07:25:00'] >>> #re.M表示將字符串視為多行,從而^匹配每一行的行首,$匹配每一行的行尾 >>> re.findall(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}",s,re.M) ['1987-02-09 07:30:00', '1987-02-10 07:25:00']4、將每行中的電子郵件地址替換為你自己的電子郵件地址
>>> import re >>> s = """693152032@qq.com, werksdf@163.com, sdf@sina.comsfjsdf@139.com, soifsdfj@134.compwoeir423@123.com""" >>> pat = re.compile(r"\w+@\w+.com") >>> pat.findall(s) ['693152032@qq.com', 'werksdf@163.com', 'sdf@sina.com', 'sfjsdf@139.com', 'soifsdfj@134.com', 'pwoeir423@123.com'] >>> >>> pat.sub("我愛你嘉大@163.com",s) '我愛你嘉大@163.com, 我愛你嘉大@163.com, 我愛你嘉大@163.com\n\n 我愛你嘉大@163.com, 我愛你嘉大@163.com\n\n 我愛你嘉大@163.com'5、使用正則提取出字符串中的單詞
>>> import re >>> s="""i love you not because of who 234 you are, 234 but 3234ser because of who i am when i am with you""" >>> pat = re.compile(r"\b[A-Za-z]+\b") >>> pat.findall(s) ['i', 'love', 'you', 'not', 'because', 'of', 'who', 'you', 'are', 'but', 'because', 'of', 'who', 'i', 'am', 'when', 'i', 'am', 'with', 'you'] >>> words = pat.findall(s) >>> words = set(words) #將列表轉(zhuǎn)換為集合,去重復(fù) >>> print(words) {'with', 'when', 'because', 'i', 'am', 'are', 'you', 'not', 'who', 'but', 'love', 'of'} >>> len(words) 126、匹配一段文本中所有的身份證數(shù)字
>>> import re >>> s = """sfafsf,34234234234,1231313132,154785625475896587,sdefgr54184785ds85,4864465asf86845,15478562547589658X,15478562547589658x""" >>> pat = re.compile(r"\d{17,18}[X,x]?") >>> pat.findall(s) ['154785625475896587,', '15478562547589658X', '15478562547589658x'] >>>7、匹配一個(gè)浮點(diǎn)數(shù)
>>> import re >>> s = "-1,-2.5,8.8,1,0" >>> pat = re.compile(r"[+|-]?\d+\.\d*") >>> pat.findall(s) ['-2.5', '8.8']8、匹配漢字
>>> import re >>> s = "skda我愛嘉大。" >>> pat = re.compile(r"[\u4e00-\u9fa5]{0,}") #Unicode表中的漢字的頭和尾。 >>> pat.findall(s) ['', '', '', '', '我愛嘉大', '', ''] >>> for i in hanzi: #清除空字符串if i == '':hanzi.remove(i)else:continue >>> hanzi ['我愛嘉大']>>> import re >>> s = "skda我愛嘉大。" >>> pat = re.compile(r"[\u4e00-\u9fa5]{1,}") >>> pat.findall(s) ['我愛嘉大']9、?匹配網(wǎng)址
>>> import re >>> s = """http://www.interoem.com/messageinfo.asp?id=35 http://3995503.com/class/class09/news_show.asp?id=14 http://lib.wzmc.edu.cn/news/onews.asp?id=769 http://www.zy-ls.com/alfx.asp?newsid=377&id=6 http://www.fincm.com/newslist.asp?id=415""" >>> s = s.splitlines() >>> pat = re.compile(r"http://.*(com/|cn/)") >>> for i in s:print(pat.match(i).group())http://www.interoem.com/ http://3995503.com/ http://lib.wzmc.edu.cn/ http://www.zy-ls.com/ http://www.fincm.com/ >>>10、匹配合法的IP地址
>>> import re >>> s = "10.16.20.3" #這里可以改為用戶輸入的IP地址 >>> pat = re.compile("^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$") >>> pat.match(s).group() '10.16.20.3' >>>11、?取出屬性data-original對(duì)應(yīng)的url
>>> import re >>> s = """<img data-original="https://rpic.douyucdn.cn/z1609/07/15/478748_160907150833.jpg" src="https://rpic.douyucdn.cn/z1609/07/15/478748_160907150833.jpg" style="display: block;">""" >>> pat = re.compile(r"<img data-original="(.*?)"") #雙引號(hào)單引號(hào)交叉使用 SyntaxError: invalid syntax >>> pat = re.compile(r'<img data-original="(.*?)"') >>> pat.findall(s) ['https://rpic.douyucdn.cn/z1609/07/15/478748_160907150833.jpg'] >>>?
總結(jié)
以上是生活随笔為你收集整理的python核心编程第三版(一)学习笔记:正则表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scheme语言编写运行
- 下一篇: python 12306登录_实现123