一日一技:一個括號兩種意思,正則表達式奇怪的小括號

一日一技:一個括號兩種意思,正則表達式奇怪的小括號

一日一技:一個括號兩種意思,正則表達式奇怪的小括號

在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']

運行效果以下圖所示,完成任務:
一日一技:一個括號兩種意思,正則表達式奇怪的小括號

相關文章
相關標籤/搜索