參考文件:
**/語法說明.
匹配除換行符以外的任意字元
\w匹配字母或數字或下劃線或漢字
\s匹配任意的空白符
\d匹配數字
\b匹配單詞的開始或者結束
^匹配字串的開始
$匹配字串的結束
如:^\d$ 匹配5-12數字
**/語法說明*
重複零次或者更多次
+重複一次或者更多次
?重複零次或者一次
重複n次
重複n次或者更多次
重複n到m次
^\w+匹配一行的第乙個單詞(或整個字串的第乙個單詞,具體匹配哪個意思得看選項設定)
(?0\d[) -]?\d
這個表示式可以匹配幾種格式的**號碼,像(010)88886666,或022-22334455,或02912345678等。
分析:首先是乙個轉義字元(,它能出現0次或1次(?),然後是乙個0,後面跟著2個數字(\d),然後是)或-或空格中的乙個,它出現1次或不出現(?),最後是8個數字(\d)。
但是這個表示式也能匹配010)12345678或(022-87654321這樣的「不正確」的格式。要解決這個問題,我們需要用到分枝條件,正規表示式裡的分枝條件指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用 | 不同的規則分隔開。聽不明白?沒關係,看例子:
0\d-\d|0\d-\d這個表示式能匹配兩種以連字型大小分隔的**號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。
(0\d)[- ]?\d|0\d[- ]?\d這個表示式匹配3位區號的**號碼,其中區號可以用小括號括起來,也可以不用,區號與本地號間可以用連字型大小或空格間隔,也可以沒有間隔。你可以試試用分枝條件把這個表示式擴充套件成也支援4位區號的。
可以用小括號來指定子表示式並指定這個字表示式的重複次數
如:(\d.)\d是乙個簡單的ip位址匹配表示式。要理解這個表示式,請按下列順序分析它:\d匹配1到3位的數字,(\d.)匹配三位數字加上乙個英文句號(這個整體也就是這個分組)重複3次,最後再加上乙個一到三位的數字(\d)。
**/語法
說明\w
匹配任意不是字母,數字,下劃線,漢字的字元
\s匹配任意不是空白符的字元
\d匹配任意非數字的字元
\b匹配不是單詞開頭或結束的位置
[^x]
匹配除了x以外的任意字元
[^aeiou]
匹配除了aeiou這幾個字母以外的任意字元
例子:\s+匹配不包含空白符的字串。
]+>匹配用尖括號括起來的以a開頭的字串。
使用小括號指定乙個子表示式後,匹配這個子表示式的文字(也就是此分組捕獲的內容)可以在表示式或其它程式中作進一步的處理。預設情況下,每個分組會自動擁有乙個組號,規則是:從左向右,以分組的左括號為標誌,第乙個出現的分組的組號為1,第二個為2,以此類推。
\b(\w+)\b\s+\1\b可以用來匹配重複的單詞,像go go, 或者kitty kitty。這個表示式首先是乙個單詞,也就是單詞開始處和結束處之間的多於乙個的字母或數字(\b(\w+)\b),這個單詞會**獲到編號為1的分組中,然後是1個或幾個空白符(\s+),最後是分組1中捕獲的內容(也就是前面匹配的那個單詞)(\1)。
你也可以自己指定子表示式的組名。要指定乙個子表示式的組名,請使用這樣的語法:(?\w+)(或者把尖括號換成』也行:(?『word』\w+)),這樣就把\w+的組名指定為word了。要反向引用這個分組捕獲的內容,你可以使用\k,所以上乙個例子也可以寫成這樣:\b(?\w+)\b\s+\k\b。
使用小括號的時候,還有很多特定用途的語法。下面列出了最常用的一些:
分類**/語法
說明捕獲
(exp)
匹配exp,並捕獲文字到自動命名的組裡
捕獲(?exp)
匹配exp,並捕獲文字到名稱為name的組裡,也可以寫成(?'name』exp)
捕獲(?:exp)
匹配exp,不捕獲匹配的文字,也不給此分組分配組號
零寬斷言
(?=exp)
匹配exp前面的位置
零寬斷言
(?<=exp)
匹配exp後面的位置
零寬斷言
(?!exp)
匹配後面跟的不是exp的位置
零寬斷言
(?匹配前面不是exp的位置
注釋(?#comment)
這種型別的分組不對正規表示式的處理產生任何影響,用於提供注釋讓人閱讀
接下來的四個用於查詢在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像\b,^,$那樣用於指定乙個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。最好還是拿例子來說明吧:
(?=exp)也叫零寬度正**先行斷言,它斷言自身出現的位置的後面能匹配表示式exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查詢i』m singing while you』re dancing.時,它會匹配sing和danc。
(?<=exp)也叫零寬度正回顧後發斷言,它斷言自身出現的位置的前面能匹配表示式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re以外的部分),例如在查詢reading a book時,它匹配ading。
假如你想要給乙個很長的數字中每三位間加乙個逗號(當然是從右邊加起了),你可以這樣查詢需要在前面和裡面新增逗號的部分:((?<=\d)\d)+\b,用它對1234567890進行查詢時結果是234567890。
下面這個例子同時使用了這兩種斷言:(?<=\s)\d+(?=\s)匹配以空白符間隔的數字(再次強調,不包括這些空白符)。
**/語法
說明\a
報警字元(列印它的效果是電腦嘀一聲)
\b通常是單詞分界位置,但如果在字元類裡使用代表退格
\t製表符,tab
\r回車
\v豎向製表符
\f換頁符
\n換行符
\eescape
\0nn
ascii**中八進位制**為nn的字元
\xnn
ascii**中十六進製制**為nn的字元
\unnnn
unicode**中十六進製制**為nnnn的字元
\cnascii控制字元。比如\cc代表ctrl+c
\a字串開頭(類似^,但不受處理多行選項的影響)
\z字串結尾或行尾(不受處理多行選項的影響)
\z字串結尾(類似$,但不受處理多行選項的影響)
\g當前搜尋的開頭
\punicode中命名為name的字元類,例如\p
(?>exp)
貪婪子表示式
(?-exp)
平衡組(?im-nsx:exp)
在子表示式exp中改變處理選項
(?im-nsx)
為表示式後面的部分改變處理選項
(?(exp)yes
no)(?(exp)yes)
同上,只是使用空表示式作為no
(?(name)yes
no)(?(name)yes)
同上,只是使用空表示式作為no
python正規表示式元字元 正規表示式
字元 描述將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...
Python 正規表示式
1.在python中,所有和正規表示式相關的功能都包含在re模組中。2.字元 表示 字串的末尾 如 road 則表示 只有當 road 出現在乙個字串的尾部時才會匹配。3.字元 表示 字元中的開始 如 road 則表示 只有當 road 出現在乙個字串的頭部時才會匹配。4.利用re.sub函式對字串...
Python正規表示式
學習python自然而然就不得不面對正規表示式這個難題。當初在沒有學習python之前,自己也曾經嘗試著學習過正規表示式,但是那時候感覺很麻煩,很難懂,結果就是不了了之。但是現在學習python我用的書是 python基礎教程 第二版 這本書中對re模組的講解很簡單易懂,內容不多但起碼把人領進門了,...