正規表示式 括號

2022-09-03 13:54:07 字數 2059 閱讀 3783

用字元組和量詞可以匹配引號字串,也可以匹配 html tag,如果需要用正規表示式匹配身份證號碼,依靠字元組和量詞能不能做到呢? 

身份證號碼是乙個長度為15或18個字元的字串,如果是15位,則全部由數字組成,首位不能為0;如果是18位,則前17位全部是數字,末位可能是數字,也可能是x。規則非常明確,可以嘗試編寫正規表示式了。

首位是數字,不能為0

[1-9]

除去首末2位,剩下13位或16位,且都是數字

d末位可能是數字,也可能是x

[0-9x]

整個表示式是[1-9]\d[0-9x],它的匹配如例3-1所示。

例3-1 身份證號碼的匹配

idcardregex = r"^[1-9]\d[0-9x]$"

re.search(idcardregex, "

110101198001017032

") != none #

=> true

re.search(idcardregex,

"1101018001017016

") != none #

=> true

re.search(idcardregex,

"11010119800101701x

") != none #

=> true

看來,果然能夠匹配各種形式的身份證號碼,應該沒問題。不過這還不夠,這個正規表示式應該保證身份證號碼的字串能夠匹配,其他字串不能夠匹配,例3-2展示了非身份證號碼的匹配情況。 

例 3-2 身份證號碼的錯誤匹配

re.search(idcardregex, "

1101011980010176

") != none #

=> true

re.search(idcardregex,

"110101800101701x

") != none #

=> true

這兩個字串分明不是身份證號碼(第乙個有16位長,第二個雖然有15位長,但本尾是x),卻都匹配了。這是為什麼呢?仔細觀察所用的正規表示式,會發現兩點原因:第一表示除去首尾兩位,中間的部分長度可能在13~16之間,而不是「長度要麼為13,要麼為16」;第二,最後的[0-9x]只應該對應18位身份證號碼的情況,但是在這個表示式中,它也可以對應到15位身份證號碼,而15位身份證號碼的末位是不能為x的!

雖然字串的長度是可變的,但是除去第一位和最後一位,中間部分的長度必須明確指定,只能是13或者16,而不能使用量詞;另外,末尾一位到底是[0-9](也就是\d)還是[0-9x],取決於長度——如果長度是15位,則是\d;如果長度是18位,則是[0-9x]。區分兩種情況分別考慮,要更加清楚一些。

15 位身份證號碼 [1-9]\d

18 位身份證號碼 [1-9]\d\d[0-9x]

正規表示式改寫為 [1-9]\d(\d[0-9x])?

括號的這種功能,叫做分組(grouping)

分組是非常有用的功能,因為使用正規表示式時經常會遇到並沒有直接相連,但確實存在聯絡的部分,分組可以把這些概念上相關的部分「歸攏」到一起,以免割裂。

/foo/bar_qux.php

之所以會亂套,根源在於有些元素雖然是「不一定出現」的。可是,「不一定出現」的元素之間卻是有關聯的:「不一定出現」的元素雖然沒有直接相連,卻是「要麼同時出現,要麼同時不出現」的關係。這時候就要梳理清楚邏輯關係,用括號的分組功能把各種分支情況歸攏到一起。

/foo是必須出現的;之後存在兩種可能; /bar.php或者/bar_ qux.php。前一種情況中,開頭的/、控制器名bar、結尾的.php是必須出現的;在後一種情況中,開頭的/、控制器名bar、下畫線_、模組名qux、結尾的.php是必須出現的。

正確urlpatternregex = r"^[a-za-z]+(/[a-za-z]+(_[a-za-z]+)?\.php)?$"

例 3-8 完整匹配 e-mail 位址的正規表示式

emailregex = r"^[-\w.]@([-a-za-z0-9]\.)*[-a-za-z0-9]$"

正規表示式括號的使用

正規表示式括號的使用 1 分組 上一章提到過的量詞只針對緊鄰的字元 組 起作用,例如html語言中的標籤 匹配 s s 其中忽略優先量詞 只對緊鄰的字元組 s s 起作用,如果需要對之前所有的部分起作用就需要用到圓括號 寫成 s s 起到了將 s s 看做乙個整體的作用,即分組。2 多選結構 括號的...

python正規表示式括號問題

正規表示式中的圓括號 的作用是對字元或元字元分組。我錯把它的作用認為是將圓括號內的字元看成乙個整體。儘管在一些正則測試 上,進行匹配時,把括號內的字元看成乙個整體來匹配也能匹配到想要的結果。測試 如 regex101等 然而在在寫python程式的時候,會出現不是我想要的結果。如果正規表示式中多出使...

小括號 中括號 大括號(正規表示式)

一 小括號 中括號 大括號的區別 1 小括號 匹配小括號內的字串,可以是乙個,也可以是多個,常跟 或 符號搭配使用,是多選結構的 示例1 string name way2014 regex way zgw result 結果是可以匹配出way的,因為是多選結構,小括號是匹配字串的 示例2 strin...