正则表达式在python中的应用_学习正则表达式在python中的应用
目的:對(duì)文本的處理,正則表達(dá)式的功能很強(qiáng)大,可以很巧妙的過濾、匹配、獲取想要的字符串,是必須學(xué)習(xí)的技能,這里只記錄常用的寫法,詳細(xì)文檔可以參看官方幫助文檔。
環(huán)境:ubuntu 16.04 python 3.5
在python中使用正則表達(dá)式首先要導(dǎo)入re模塊import re
在re模塊中有幾個(gè)常用的函數(shù):
re.compile('value')
它會(huì)返回一個(gè)正則表達(dá)式regex對(duì)象,作用是對(duì)預(yù)編譯提速,且第二個(gè)參數(shù)支持一些方法,把它返回給一個(gè)變量方便重復(fù)使用,函數(shù)有兩個(gè)參數(shù):匹配表達(dá)式和第二個(gè)可選參數(shù):
匹配表達(dá)式即,正則表達(dá)式的寫法,因?yàn)楸磉_(dá)式中常用\符號(hào),所以一般第一個(gè)參數(shù)下載r''內(nèi),r表示引號(hào)內(nèi)為自然字符,python不對(duì)內(nèi)部做轉(zhuǎn)義,這樣正則表達(dá)式用轉(zhuǎn)義時(shí)不用多加一個(gè)\,如:r'\d',\d在正則中是匹配一個(gè)數(shù)字,如果沒有r則要寫成'\\d',這樣很麻煩且不易閱讀。
最簡(jiǎn)單的匹配:r'haha'匹配字符'haha',但不匹配'hehe',可以使用通配符,下面介紹:
常用通配符:
\d表示一個(gè)數(shù)字
\w表示字母、數(shù)字、下劃線中任意一個(gè),且在python3中支持匹配一個(gè)漢字。
\s表示空格、制表符和換行中任意一個(gè)。
\D, \W, \S是他們的非模式。
^匹配字符串起始位置,當(dāng)^在方括號(hào)內(nèi)是表示非模式,[^a-z]小寫26個(gè)字母以外。
$匹配字符串結(jié)尾位置。
\b表示一個(gè)字符旁空格的位置,'it is a good job', \bgoog\b匹配good,而不會(huì)匹配goods等其他。
| 豎杠表示或,如\d|\d{2},匹配一個(gè)數(shù)字或兩個(gè)數(shù)字。
自定義通配符:
[a-z]表示小寫a到z的26個(gè)字母中任意一個(gè)
[]中括號(hào)模式可以包含很多,比如:[a-zA-Z0-9_]這個(gè)就是\w(只在python2中相等),還可以想這樣[aeiou]只包含想要匹配的,或者特殊符號(hào)[._-],需要轉(zhuǎn)義的要加上\。
以上都是只匹配符合的一個(gè),下面學(xué)習(xí)數(shù)量:
匹配最少:{5} 表示5次,{1,5}表示1次到5次都可以,{1,}省略后面的表示至少1次。
貪婪匹配:+等同于{1,},*表示可無(wú)或更多,?表示一次或更多,.點(diǎn)表示就是\S,這里都會(huì)匹配多的結(jié)果,因?yàn)槭秦澙纺J健?/p>
限制貪婪:在貪婪模式后面加上?表示限制貪婪,匹配最少,+會(huì)盡量匹配多的,+?匹配一個(gè)。
numRegex = re.compile(r'\d{11}')
# 生成匹配11位數(shù)字的正則對(duì)象,\d是數(shù)字,{11}代表11次
re.compile()的第二個(gè)參數(shù)有:re.VERBOSE, re.IGNORECASE和re.DOTALL,后面要大寫。
re.VERBOSE表示匹配中可以多行且有注釋,在復(fù)雜的正則對(duì)象中使用。re.compile(r'''(
\d #匹配一個(gè)數(shù)字
\w #匹配一個(gè)字符
)''', re.VERBOSE)
re.IGORECASE表示匹配不區(qū)分大小寫:re.compile(r'[a-z]', re.IGORECASE)
這個(gè)即可以匹配a,也可以匹配A。
re.DOTALL表示允許.匹配包括\s的內(nèi)容re.compile(r'.*', re.DOTALL)
匹配所以內(nèi)容。
匹配方法:search(), match(), findall(), finditer()
這些是匹配規(guī)則查找方法,也可以直接把正則表達(dá)式寫在他們的第一個(gè)參數(shù)的位置(測(cè)試時(shí)可以,正式編寫不推薦,理由在上面的compile中)而不用compile(),第二個(gè)參數(shù)是需要匹配的字符串,如re.search(r'\d+', 'aa123abc')
返回123
search()方法:
search()方法進(jìn)行全字符搜索,返回的是第一個(gè)符合條件的match對(duì)象,并且它只返回一個(gè),即使后面有其他符合條件的,也不處理,沒有則返回None。aa = re.compile(r'\d\d\d+')
bb = aa.search('aa12345abc678')
bb得到返回的包含12345的match對(duì)象,而沒有678
match()方法:
match()方法從字符串開始處就匹配,且只返回一個(gè)符合條件的match對(duì)象,相當(dāng)于正則表達(dá)式以r'^開始,匹配也只返回開始部分,沒有則返回None。aa = re.compile(r'\d+')
bb = aa.search('123ab45')
bb得到返回的包含123的match對(duì)象,沒有45,且如果字符串變成'a123ab45',則返回None。
findall()方法:
findall()方法進(jìn)行全字符搜索,返回所有符合條件的值,然后組成列表,即返回一個(gè)列表對(duì)象,沒有則為空列表。aa = re.compile(r'\d+')
bb = aa.findall('a123b45c678')
bb得到返回的的列表['123', '45', '678']
finditer()方法:
finditer()方法進(jìn)行全字符串搜索,返回所有符合條件的match對(duì)象,然后組成迭代器,用for方法可以看出迭代器里面是match對(duì)象。
這里match對(duì)象有g(shù)roup(), group(index)和groups()方法:
可使用它們調(diào)用返回的match對(duì)象,group()和group(0)都是得到母值,groups()返回所有g(shù)roup(index)組成的元組。
分組和捕獲:
在正則表達(dá)式中使用圓括號(hào)()會(huì)產(chǎn)生分組,每個(gè)組都是元素,返回一個(gè)元組對(duì)象,可用group()獲取對(duì)于序號(hào)的元素:numRegex = re.compile(r'(\d)(\d)(\d)')
當(dāng)圓括號(hào)內(nèi)左邊使用?:表示不分組、不捕獲,如:(?:\d)匹配但不分組也不捕獲,不捕獲則不生成match對(duì)象。
替換方法sub():
上面已經(jīng)學(xué)習(xí)了查找,這個(gè)是替換方法,有兩種常用方式,我稱為全部隱藏替換和部分隱藏替換:
全部隱藏替換:aa = re.compile(r'engineer (\w)\w+')
bb = aa.sub(r'XX', 'engineer Ricky gave engineer Tom an apple')
bb得到字符串'XX gave XX an apple'
部分隱藏替換:aa = re.compile(r'engineer (\w)\w+')
cc = aa.sub(r'\1**', 'engineer Ricky gave engineer Tom an apple')
cc得到字符串'R** gave T** an apple'
常用的正則表達(dá)式舉例:
r'0\d{2,3}-\d{8}' 匹配固定電話,如:0755-87226688,010-85332765
總結(jié)
以上是生活随笔為你收集整理的正则表达式在python中的应用_学习正则表达式在python中的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实例方法、类方法、静态方法的
- 下一篇: python123动物重量排序_Pyth