python之正則模組Re
正則表示式
正則表示式為高階的文字模式匹配,抽取,與/或文字形式的搜尋和替換功能提供了基礎。正則表示式是一些由字元和特殊符號組成的字串,它們描述了模式的重複或者表述多個字元。
轉義符\
在正則表示式中,有很多有特殊意義的是元字元,比如\n和\s等,如果要在正則中匹配正常的"\n"而不是"換行符"就需要對""進行轉義,變成’\’。
在python中,無論是正則表示式,還是待匹配的內容,都是以字串的形式出現的,在字串中\也有特殊的含義,本身還需要轉義。所以如果匹配一次"\n",字串中要寫成’\n’,那麼正則裡就要寫成"\\n",這樣就太麻煩了。這個時候我們就用到了r’\n’這個概念,此時的正則是r’\n’就可以了。
貪婪匹配
在滿足匹配時,匹配儘可能長的字串,預設情況下,採用貪婪匹配
分組()與或|[^]
(1)^[1-9]\d{13,16}[0-9x]$ #^以數字0-9開始, \d{13,16}重複13次到16次 $結束標誌 上面的表示式可以匹配一個正確的身份證號碼 (2)^[1-9]\d{14}(\d{2}[0-9x])?$ #?重複0次或者1次,當是0次的時候是15位,是1的時候是18位 (3)^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ #表示先匹配[1-9]\d{16}[0-9x]如果沒有匹配上就匹配[1-9]\d{14}
Re模組
match方法
只能從開始字串開始的地方進行匹配
#只從字串開始匹配,並且guoup才能找到
import re
m = re.match('luck', 'luck')
if m is not None:
print(m.group()) #當返回的有物件,也就是說能夠匹配到物件,就會有結果,否則會丟擲異常
輸出:'luck’
感受一下不是從字串開始匹配,他就沒有返回值, print(m.group()) 也沒有輸出
import re m = re.match('luck', 'luck') if m is not None: print(m.group())
search方法
函式會在字串中查詢模式匹配,只會找到第一個匹配然後返回,一個包含匹配資訊的物件,該物件通過呼叫group()方法得到匹配的,如果字串沒有匹配,則報錯
import re
m = re.match('a', 'laucka')
if m is not None:
print(m.group())
輸出的就只有一個a,雖然這裡面有兩個,但是,它就會只找出第一個就返回了,不會再繼續向下找,但是這個就不能使用match方法。
findall方法
它返回要匹配出的所有結果,有幾個就會匹配幾個,最終把所有的放在列表裡面。
import re
m = re.findall('a', 'alucka')
print(m)
#輸出 [‘a’, ‘a’]
split方法
分割查詢,以某一字元分割,並把分割後的結果放在列表裡返回
sub方法,subn方法
這兩個方法一樣,都是替換與搜尋,只是,sub方法只是替換,subn方法還會返回替換的次數
引數(正則表示式,替換成的字元,要搜素的字元,要替換的次數)
sub方法
subn方法
compile方法
finditer方法
findall的優先順序
import re
ret = re.findall('www.(baidu|cnblogs).com','www.cnblogs.com')
print(ret) #結果是['cnblogs']這是因為findall會優先把匹配結果組裡內容返回,如果想要匹配結果,取消許可權即可 ret = re.findall('www.(?:baidu|cnblogs).com','www.cnblogs.com')
print(ret) #['www.oldboy.com']
split的優先順序
ret = re.split('\d+','luck123dasda9dg')#按數字分割開了
print(ret) #輸出結果:['luck', 'dasda', 'dg']
ret = re.split('(\d+)','luck123dasda9dg')
print(ret) #輸出結果:['luck', '123', 'dasda', '9', 'dg']
# 在匹配部分加上()之後和不加括號切出的結果是不同的,
# 沒有括號的沒有保留所匹配的項,但是有括號的卻能夠保留了
# 匹配的項,這個在某些需要保留匹配部分的使用過程是非常重要的
匹配標籤
import re
ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
#還可以在分組中利用?<name>的形式給分組起名字
#獲取的匹配結果可以直接用group('名字')拿到對應的值
print(ret.group('tag_name')) #結果 :h1
print(ret.group()) #結果 :<h1>hello</h1>
ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
#如果不給組起名字,也可以用\序號來找到對應的組,表示要找的內容和前面的組內容一致
#獲取的匹配結果可以直接用group(序號)拿到對應的值
print(ret.group(1))
print(ret.group()) #結果 :<h1>hello</h1>
匹配整數
import re
ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '-2', '60', '', '5', '-4', '3']
ret.remove("")
print(ret) #['1', '-2', '60', '5', '-4', '3']
數字匹配
1、 匹配一段文字中的每行的郵箱
http://blog.csdn.net/make164492212/article/details/51656638
2、 匹配一段文字中的每行的時間字串,比如:‘1990-07-12’;
分別取出1年的12個月(^(0?[1-9]|1[0-2])$)、
一個月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$
3、 匹配qq號。(騰訊QQ號從10000開始) [1,9][0,9]{4,}
4、 匹配一個浮點數。 ^(-?\d+)(\.\d+)?$ 或者 -?\d+\.?\d*
5、 匹配漢字。 ^[\u4e00-\u9fa5]{0,}$
6、 匹配出所有整數