當前位置:
首頁 > 知識 > Python 正則表達式(分組)

Python 正則表達式(分組)


Linux編程

點擊右側關注,免費入門到精通!




作者丨世界看我我看世界 


https://blog.csdn.net/SeeTheWorld518/article/details/49302829 




正則表達式分組




分組就是用一對圓括弧「()」括起來的正則表達式,匹配出的內容就表示一個分組。從正則表達式的左邊開始看,看到的第一個左括弧「(」表示第一個分組,第二個表示第二個分組,依次類推,需要注意的是,有一個隱含的全局分組(就是0),就是整個正則表達式。


 


分完組以後,要想獲得某個分組的內容,直接使用group(num)和groups()函數去直接提取就行。




例如:提取代碼中的超鏈接中的文本





>>> s=

"

<div><a href="https://support.google.com/chrome/?p=ui_hotword_search" target="_blank">

更多

</a><p>

dfsl

</p></div>

"


>>> print re.search(r

"

<a.*>

(.*)

</a>

",s).group(1)


更多




或者




>>> 

print

 re.match(

r".*<a.*>(.*)</a>"

,s).group(

1

)
更多




按照上面的分組匹配以後,我們就可以拿到我們想拿到的字串,但是如果我們正則表達式中括弧比較多,那我們在拿我們想要的字串時,要去挨個數我們想要的字串時第幾個括弧,這樣會很麻煩,這個時候Python又引入了另一種分組,那就是命名分組,上面的叫無名分組。




命名分組




命名分組就是給具有默認分組編號的組另外再給一個別名。命名分組的語法格式如下:



(

?P

<name>正則表達式)

#name是一個合法的標識符





如:提取字元串中的ip地址




>>> s = 

"ip="230.192.168.78",version="1.0.0""


>>> re.search(

r"ip="(?P<ip>d+.d+.d+.d+).*"

, s)
>>> res.group(

"ip"

)

#通過命名分組引用分組


"230.192.168.78"





後向引用




正則表達式中,放在圓括弧「()」中的表示是一個組。然後你可以對整個組使用一些正則操作,例如重複操作符。 


要注意的是,只有圓括弧」()」才能用於形成組。」「用於定義字符集。」{}」用於定義重複操作。 


當用」()」定義了一個正則表達式組後,正則引擎則會把被匹配的組按照順序編號,存入緩存。這樣我們想在後面對已經匹配過的內容進行引用時,就可以用」數字」的方式或者是通過命名分組進行」(?P=name)「進行引用。1表示引用第一個分組,2引用第二個分組,以此類推,
引用第n個組。而則引用整個被匹配的正則表達式本身。這些引用都必須是在正則表達式中才有效,用於匹配一些重複的字元串。 


如:




#通過命名分組進行後向引用


>>> re.search(

r"(?P<name>go)s+(?P=name)s+(?P=name)"

"go go go"

).group(

"name"

)

"go"


#通過默認分組編號進行後向引用


>>> re.search(

r"(go)s+1s+1"

"go go go"

).group()

"go go go"





交換字元串的位置





>>> s = 

"abc.xyz"


>>> re.sub(

r"(.*).(.*)"

r"2.1"

, s)

"xyz.abc"





前向肯定斷言、後向肯定斷言




前向肯定斷言的語法:



(?=pattern)




後向肯定斷言的語法:



(?<=pattern)




需要注意的是,如果在匹配的過程中,需要同時用到前向肯定斷言和後向肯定斷言,那麼必須將後向肯定斷言寫在正則語句的前面,前向肯定斷言寫在正則語句的後面,表示後向肯定模式之後,前行肯定模式之前。 




如:獲取c語言代碼中的注釋內容



>>> s1=

"""char *a="hello world"; char b="c"; /* this is comment */ int c=1; /* t
his is multiline comment */"""


>>> re.findall( 

r"(?<=/*).+?(?=*/)"

 , s1 ,re.M|re.S)
[

" this is comment "

" this is multiline comment "

]




(?<=/*)這個是後向肯定斷言,表示「/*」之後。(?=*/)這個為前向肯定斷言,表示「*/」之前,這兩合併起來就是一個區間了,所以後向肯定斷言放在前向肯定斷言前面。




前向否定斷言、後向否定斷言




前向否定斷言語法:




(?!pattern)




後向否定斷言語法:




(?<!pattern)




前向否定和後向否定實例:




#提取不是.txt結尾的文件


>>> f1 = 

"aaa.txt"


>>> re.findall(

r".*..*$(?<!txt$)"

,f1)
[]

#提取不以數字開頭的文件


>>> re.findall(

r"^(?!d+).*"

,

"1txt.txt"

)
[]

#提取不以數字開頭不以py結尾的文件


>>> re.findall(

r"^(?!d+).+?..*$(?<!py$)"

,

"test.py"

)
[]

>>> re.findall(

r"^(?!d+).+?..*$(?<!py$)"

,

"test.txt"

)
[

"test.txt"

]




 推薦↓↓↓ 






??

16個技術公眾號

】都在這裡!


涵蓋:程序員大咖、源碼共讀、程序員共讀、數據結構與演算法、黑客技術和網路安全、大數據科技、編程前端、Java、Python、Web編程開發、Android、iOS開發、Linux、資料庫研發、幽默程序員等。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發 的精彩文章:

Python分散式爬蟲詳解(二)
其實我對你還是有感覺的

TAG:Python開發 |