在Python裏面,當咱們要從一段正則表達式中提取出一部份內容的時候,咱們能夠把這部份內容用小括號包起來。例如:從字符串 個人密碼123456abc中提取 123456abc,咱們能夠這樣寫正則表達式:正則表達式
import re s = '個人密碼123456abc' password = re.findall('密碼(.*?)$', s) print(password)
運行效果以下圖所示:ide
在這個例子裏面,小括號的意思是「分組」。code
可是,在正則表達式裏面,小括號還有另一個意思,那就是把幾個符號放在一塊兒,做爲一個總體。blog
例如,還有另外一個字符串 個人口令123456abc,這裏密碼前面是 口令,爲了使用同一個正則表達式來從這兩個句子裏面提取密碼,那麼須要表達 密碼或口令(.*?)$這個意思。字符串
但若是咱們這樣寫:it
密碼|口令(.*?) $
它實際上表達的意思是 密碼令(.?)$或者 密口令(.?)$。class
因此咱們須要把 (密碼)和 口令做爲總體來看待。此時,正則表達式自己支持使用括號來表示:import
(密碼|口令)(.*?) $
在正則表達式裏面,小括號內部的 |左右兩側的多個字符串會做爲總體,這樣就能表示 密碼(.?)$或 口令(.?)$了。密碼
可是,正則表達式裏面做爲總體的小括號,與Python裏面用來分組的小括號發生了衝突,因而咱們會發現提取出來的內容並非咱們想要的:
im
能夠看到,這裏, (密碼|口令)它同時即有正則表達式裏面做爲總體的功能,又有Python裏面分組的功能。因而結果就多出來了咱們不想要的東西。
那麼有什麼辦法讓 (密碼|口令)只實現正則表達式裏面的做爲總體的功能,不實現Python裏面的分組功能呢?這個時候就須要使用正則表達式裏面的一個組合符號 ?:了。
請你們對比下面三個結果:
能夠看到, >.?<與 <(?:.?)>的做用是同樣的。這就說明,以 ?:開頭的小括號,它失去了分組的功能。
所以,咱們把這個特徵用到一開始的例子中:
>>> import re >>> s = '個人密碼123456abc' >>> re.findall('(?:密碼|口令)(.*?)$', s) ['123456abc'] >>> s = '個人口令123456abc' >>> re.findall('(?:密碼|口令)(.*?)$', s) ['123456abc']
運行效果以下圖所示,完成任務: