1.5 排除型字元組
在方括號[…]中列出希望匹配的所有字元,這種字元組叫做"普通字元組",它的確非常方便。不過,也有些問題是普通字元組不能解決的。
給定乙個由兩個字元構成的字串str,要判斷這兩個字元是否都是數字字元,可以用[0-9][0-9]來匹配。但是,如果要求判斷的是這樣的字串--第乙個字元不是數字字元,第二個字元才是數字字元(比如a8、x6) --應當如何辦?數字字元的匹配很好處理,用[0-9]即可;"不是數字"則很難辦--不是數字的字元太多了,全部列出幾乎不可能,這時就應當使用排除型字元組。
排除型字元組(negated character class)非常類似普通字元組[…],只是在開方括號[之後緊跟乙個脫字元^,寫作[^…],表示"在當前位置,匹配乙個沒有列出的字元"。所以[^0-9]就表示"0~9之外的字元",也就是"非數字字元"。那麼,[^0-9][0-9]就可以解決問題了,如例1-13所示。
例1-13 使用排除型字元組
re.search(r"^[^0-9][0-9]$", "a8") != none #=> true
re.search(r"^[^0-9][0-9]$", "x6") != none #
=> true
排除型字元組看起來很簡單,不過新手常常會犯乙個錯誤,就是把"在當前位置,匹配乙個沒有列出的字元"理解成"在當前位置不要匹配列出的字元"兩者其實是不同的,後者暗示"這裡不出現任何字元也可以"。例1-14很清楚地說明:排除型字元組必須匹配乙個字元,這點一定要記住。
例1-14 排除型字元組必須匹配乙個字元
re.search(r"^[^0-9][0-9]$", "8") != none #=> false
re.search(r"^[^0-9][0-9]$", "a8") != none #
=> true
除了開方括號[之後的^,排除型字元組的用法與普通字元組幾乎完全相同,唯一需要改動的是:在排除型字元組中,如果需要表示橫線字元-(而不是用於"-範圍表示法"),那麼-應該緊跟在^之後;而在普通字元組中,作為普通字元的橫線-應該緊跟在開方括號之後,如例1-15所示。
例1-15 在排除型字元組中,緊跟在^之後的-不是元字元
#匹配乙個-、0、9之外的字元
re.search(r"^[^-09]$", "-") != none #
=> false
re.search(r"^[^-09]$", "8") != none #
=> true
#匹配乙個0~9之外的字元
re.search(r"^[^0-9]$", "-") != none #
=> true
re.search(r"^[^0-9]$", "8") != none #
=> false
在排除型字元組中,^是乙個元字元,但只有它緊跟在[之後時才是元字元,如果想表示"這個字元組中可以出現^字元",不要讓它緊挨著[即可,否則就要轉義。例1-16給出了三個正規表示式,後兩個表示式實質是一樣的,但第三種寫法很麻煩,理解起來也麻煩,不推薦使用。
例1-16 排除型字元組的轉義
#匹配乙個0、1、2之外的字元
re.search(r"^[^012]$", "^") != none #
=> true
#匹配4個字元之一:0、^、1、2
re.search(r"^[0^12]$", "^") != none #
=> true
#re.search(r"^[\^012]$", "^") != none #
=> true
正規表示式排除特定字串
額外知識一 asp.net正則獲取鏈結 regex reg new regex href regexoptions.ignorecase matchcollection matches reg.matches html foreach match match in matches 額外知識點二 as...
正規表示式 普通字元組(續)
正規表示式提供了 範圍表示法 range 它更直觀,能進一步簡化字元組。所謂 範圍表示法 就是用 x y 的形式表示x到y整個範圍內的字元,省去一一列出的麻煩,這樣 0123456789 就可以表示為 0 9 如果你覺得這不算什麼,那麼確實比 abcdefghijklmnopqrstuvwxyz 簡...
利用正規表示式排除特定字串
1.例子,查詢不以baidu開頭的字串。正則 baidu 匹配結果就是第2行,也就是第1行被排除了 這裡使用了零寬度斷言 exp 注意,我們有乙個向前查詢的語法 也叫順序環視 exp exp 會查詢exp之前的 位置 如果將等號換成感嘆號,就變成了否定語義,也就是說查詢的位置的後面不能是exp 一般...