用字元組和量詞可以匹配引號字串,也可以匹配 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...