正則表達式(一)
正則表達式又稱為正則法則,是一種字符串文本的處理方式,常用於字符串文本中定位或者查找一段信息,是通用的字符串方法。
字符組
普通字符組
字符組是正則表達式最基本的結構之一。字符組表示“同一位置上可能出現的各種字符”,寫法:[ ]方括號之間列出所有可能出現的字符。例如:[123]、[ab]、[#.?]等等。具體含義:[013456789]表示在同一個位置上可能出現0-9中任意一個數,重點強調是一位和一個數。此外,字符組中的字符出現順序和出現次數對字符組沒有影響,[0123456789]和[0215436879]是完全一致的。
范圍表示法:[0123456789]是不是忒長了?OK,用-表示范圍,即:[0-9],如此一來是不是多快好省。但是要注意一點,不能9-0,因為9大於0啊。那如果是字母呢,可以[a-z]或者[A-Z],也不能z-a或者Z-A,因為在ASCII碼表中每個字符都是有一個十進制碼值的,如:0是45,A是65,a是97。而范圍表示是碼值小的-碼值大的,按照書寫規范上,應該是0-9,A-Z,a-z,切記不要錯誤認為A-z表示26個大寫字母和26個小寫字母,它們之間還有其他字母呢。大、小寫字母表示方法為:[A-Za-z].
元字符與轉義
字符組中的橫線-用來表示范圍,就不能用來匹配橫線-字符了,這種在匹配中具有特殊意義的字符就是元字符。如果想要讓元字符失去特殊意義來匹配普通字符,只能通過轉義來完成,轉義是指在正則表達式中的元字符前面加上反斜杠\字符。例如:[0\-9]表示匹配0、-、9中的一個字符。
注意,[-09]也表示匹配-、0、9中的一個字符,而[0-9]表示匹配0到9中任意一個數字。足以表明元字符的使用也需要結合一定的使用位置,改變位置有可能使得元字符自動轉義。
正則表達式的本質:正則表達式本身是按照定義的規則把字符組合成的字符串,正則表達式在代碼中運行的前提是字符串,其次才是正則表達式,最后是按照正則匹配的結果。
正則在程序中執行流程可以看出,從代碼到得出匹配結果需要進行兩次解析。第一次解析是從代碼轉化為正則表達式,第二次解析是把正則表達式解析成完整含義的正則規則,然后作用於字符串文本查找匹配,得出匹配結果。
因此,在正則規則中[0\-9]表示匹配0、-、9中的任意一個字符,那么[0\-9]便為正則表達式,其含義“匹配0、-、9中的任意一個字符”便是解析而來的正則規則,有了正則規則再應用於文本查找匹配可以輕易找到匹配結果。那反推回去,代碼中應該如何表示正則表達式呢?前面我們談到,正則表達式實質是字符串,在python或者其他編程語言中都存在字符串轉義的概念,如果需要的結果是[0\-9],那我們代碼中需要對“\”轉義,通常使用“\\”得出“\”。故,代碼中我們需要寫[0\\-9]才可得出[0\-9]的正則表達式。
前面提到了代碼中的轉義問題,與之而來的是原生字符串的了,python代碼中通常使用r“\”表示“\\”,也就是說在字符串的前面加上r可以表示原生字符串了,同樣的原生字符串也就省略了代碼解析成為正則表達式的過程,只需要在代碼中寫上r“正則表達式”即可。
排除型字符組
類似於普通字符組,在普通字符組 [ 方括號開始后加上脫字符^,寫成[^0-9],表示當前位置上,匹配一個沒有列出的字符,即匹配不是0-9的數字(非數字)。此外脫字符^可以用於正則表達式的開始處,表示起始位置;$可以用於正則表達式的結束處,表示結束位置。^[^0-9][0-9]$表示匹配以非數字開頭,數字結尾的兩位字符。
字符組簡記
字符組[0-9]表示數字字符,[a-z]表示小寫字母字符,[A-Z]表示大寫字母字符,字符組可以表示其含義,但是符號使用又稍微有點復雜。字符組簡記是使用語義化的語言來替代字符組進而達成和字符組相同的含義。
普通字符組簡記:\d表示數字(digital)字符,等效於[0-9];\w表示單詞(word)字符,等效於[-0-9a-zA-Z],單詞字符是指數字、大小寫字母、下划線;\s表示空白(space)字符,等效於[ \t\n\v\r\f](第一個字符為空格),空白字符是一些特殊轉義字符,如\t制表符,\n換行符,\r回車符等等。
字符組簡記既可以單獨使用,也可以結合字符組一起使用,如^[^\d][a-z]\w$,表示匹配3個字符的字符串,且字符串以非數字開頭,中間是a到z中的任意一個字符,最后結尾處時一個單詞字符,數字字母下划線中的任意一個。
排除型字符組簡記:\D表示非數字字符,\W表示非單詞字符,\S表示非空白字符。可以看出是對普通字符組簡記的互補,也是對普通字符組簡記的相對面,表示\d能匹配,\D一定不能匹配...,此外,利用其互補特性,可以實現全集效果,如[\d\D]、[\w\W]、[\s\S]均可表示匹配任意字符。