Python基礎 正規表示式

2021-08-19 21:59:50 字數 3898 閱讀 4343

re模組(正規表示式):

*元字元:不是普通的字元,是特殊字元!

1:萬用字元:. 可以匹配除了換行符以外的任意乙個字元

例子:re.findall('l..e',"abcloveabc") #匹配字串中以l開頭以e結尾且長度為4的字串,若有多個則以列表的形式返回

2:^ :以什麼開頭,只能從str開頭進行匹配

例子:re.findall('^l..e',"loveabc") #注意:只能從str的開頭進行匹配,且^前不能加其他元字元

3:$:以什麼結尾,只能從str結尾進行匹配

例子:re.findall('p.z$',"abcpzz") #返回結果:["pzz"]

4: *:匹配字元重複0-無窮次的字串

例子: re.findall('p*','abpcppdp') #返回結果['','','p','','pp','','p']

re.findall('pz*',"abcpzzzz")#返回結果是['pzzzz']

re.findall('pz*',"abcp") #返回結果是:['p']

+:匹配字元重複1-無窮次的字串 (要求匹配的字元重複次數至少是1)

例子:re.findall('pz+',"abcp") #返回結果是:

?:匹配字元重複0-1的字串

{}:打括號裡面可以給定任意數值,指定字元的重複次數

-->*

-->+

-->?

:重複的次數固定為int次

注意:上述匹配重複次數的元字元,會按照最多次進行匹配!也就是所謂的"貪婪匹配"!如果要修改這種預設的

貪婪匹配,可以再匹配規則的後面加上?就把規則變成了惰性匹配,即匹配最少的重複次數!

5.字符集:

*re.findall('x[yz]',"xyabxzxyz") #列印結果:['xy', 'xz', 'xy']

*裡面的元字元會失去其本身的功能,變成一般字元!除了幾個特殊的字元:

a-z:a到z的所有字元;^a-z:不是a到z的所有字元;\:轉義

re.findall('x[a-z]*','xawqqwe') #列印結果:['xawqqwe']

re.findall('x[^a-z]*',"xawqqwe") #列印結果:['x']

re.findall('\([^()]*\)','(12-2*(4-3*(5-3))') #列印結果:['(5-3)']

注意:()元字元,所以要轉義;裡面的()就不需要再通過\進行轉義了。匹配規則是,以(開頭,以)結尾,且

中間沒有()了,並且括號裡面的元素個數為*!目標就是找到最裡面的括號內容

6.轉義字元:\ 轉義字元比較繞,注意理解!!!

*讓沒有意義的字元變得有意義

\d-->[0-9]

\d-->[^0-9]

\s:匹配空白字元

\s:匹配非空白字元

\w-->[0-9a-za-z]

\w:-->[^0-9a-za-z]

\b:匹配特殊字元邊界 如:#,&等

*讓有意義的字元變的沒意義;例如讓元字元失去特殊功能變成一般字元 \*,\.等等

例子:import re

print(re.findall('i\\b',"i am pzz!")) #\\b會先交給python直譯器進行轉義-->\b,然後給到re模組,re認的\b不會再轉義

print(re.findall(r'i\b',"i am pzz!"))#加上乙個r,規則不會交給python直譯器,而是直接給到re模組執行

import re

print(re.findall(r'i\\z',"i\zm")) #\\把轉義字元轉義成不同字元\,然後前面加上r,就是把i\z普通字元傳給re進行匹配

print(re.findall('i\\\\z',"i\zm") #\\\\交給python直譯器轉義\\,之後交給re,re轉義\\變成不同字元\,之後進行匹配

上述2個方法的返回值都是:['i\\z'] ,並不是['i\z'].這是因為規則傳給python直譯器進行轉義之後再給到re模組轉義,然後匹配到str中的

對應字串,之後把符合規則的串返還給python直譯器,python又把\做了一次轉義,所以返回結果是\\雙反斜槓的。這裡面

做簡單了解,匹配除結果就好了!

7.或:| (str1|str2 :匹配str1或str2,注意這裡面字串長度不一定是1)

re.findall('ia|m',"iampzz!") #返回結果是:['ia', 'm']

8:分組:()

*re.findall("(abc)+","abcabc") #列印結果:['abc']

如果不同小括號進行分組,只會匹配+前面的乙個字元,而加上之後可以對()裡面的字串進行+規則的匹配!由於()的

優先順序問題,優先匹配()裡面的內容,所以返回結果是['abc'].可以通過"(?:abc)+"取消優先順序,這樣返回結果是

['abcabcabc'].

*'(?p匹配規則)'

re.search('(?p[a-z]+)(?p\d+)','alex12pzz13').group("name") #列印結果:'alex

re.search('(?p[a-z]+)(?p\d+)','alex12pzz13').group("age") #列印結果:'12'

注意:?p:除了name可以任意,其他的都是固定格式。類似字典,通過key拿到對應分組的數值.如果不用上述格式

也可以:

re.search('([a-z]+)(\d+)','alex12pzz13').group() #列印結果:『alex12』

第一方法可以通過key拿到不同分組的數值,而這個方法會把不同分組數值全列印!推薦第一種

*re下的方法:

*re模組的search與findall方法區別:findall方法會把符合規則的字串以列表的形式返回;而search會把符合規則的字串

以物件的形式返回,通過group方法獲得字串,而且search只會匹配第乙個,不會匹配多個!

*re.match(str1,str2):只會從字串的開頭按照規則進行匹配且只會匹配乙個結果,並且返回值是物件。

通過group方法獲得匹配到的字串(類似在search方法的規則前加^)

*re.split():

print(re.split(" ","abc abc abc")) #按照空格分割字串

print(re.split("[| ]","abc abc|abc")) #按照空格或是|分割字串

print(re.split("[ab]","abcabcabc")) #如果裡面的字元在匹配字串的前後都有則留下對應數量的'',如果在中間留下(個數-1)個''

注意:規則的字串前後不要亂加空格,否則會發生意想不到的錯誤!

*re.sub(規則,str1,str2,int):把str2中符合規則的字串用str1替換掉int次!返回結果是:替換後的字串

re.subn(規則,str1,str2):返回結果是:(替換後的字串,替換的次數)

*obj=re.compile(規則)

obj.findall(str)

上述兩行**等價於re.findall(規則,str)!上述方式的優勢就是如果規則被多次使用,則這個方式方便

*re.finditer(規則,str):與findall方法一致,只是finditer返回值是可迭代物件,通過呼叫next方法迭代元素,而這個元素

是乙個物件,在通過group方法獲得符合規則的字串!

*如果規則中存在(),則優先返回()裡面匹配的內容;也可以通過(?:)去掉優先順序!

re.findall("www\.(baidu|360)\.com","adfawww.baidu.comad") #返回結果:['baidu']

re.findall("www\.(?:baidu|360)\.com","adfawww.baidu.comad")#返回結果:['www.baidu.com']

Python 正規表示式(基礎)

正規表示式 regular expression 是乙個特殊的字串行,描述了一種字串匹配的模式可以用來檢查乙個串是否含有某種子串 將匹配的子串替換或者從某個串中取出符合某個條件的子串,或者是在指定的文章中,抓取特定的字串等。python處理正規表示式的模組是re模組,它是python語言擁有全部的正...

Python正規表示式基礎

直接給出字元就是精確匹配。特殊字元首先需要轉義如 d 匹配乙個數字,w 匹配乙個字母或者數字。123 d 可以匹配 1231 但是無法匹配 123a d d d 可以匹配到 123 w w w 可以匹配到 py3 表示任意乙個字元,py.可以表示py3 py 等 表示任意長個字元,表示至少乙個字元,...

python基礎(正規表示式)

正規表示式用於搜尋 替換和解析字串。正規表示式遵循一定的語法規則,使用非常靈活,功能強大。使用正規表示式編寫一些邏輯驗證非常方便,例如電子郵件位址格式的驗證。python提供了re模組實現正規表示式的驗證。1.簡介 正規表示式是用於文字匹配的工具,它在源字串中查詢與給定的正規表示式相匹配的部分,乙個...