(資料上傳到github上
1.什麼叫正規表示式。
正規表示式,又稱規則表示式。(英語:regular expression,在**中常簡寫為regex、regexp或re)。
正則表通常被用來查詢、替換那些符合某個模式(規則)的文字,正規表示式就是用來做這件事的工具。
就像windows/dos下用於檔案查詢的萬用字元(wildcard),也就是*和?。如果你想查詢某個目錄下的所有的word文件的話,你會搜尋*.doc。在這裡,*會被解釋成任意的字串。和萬用字元類似,正規表示式也是用來進行文字匹配的工具,只不過比起萬用字元,它能更精確地描述你的需求——當然,代價就是更複雜——比如你可以編寫乙個正規表示式,用來查詢所有以0開頭,後面跟著2-3個數字,然後是乙個連字型大小「-」,最後是7或8位數字的字串(像010-12345678或0376-7654321)。
(talk is cheap ,show you the code )
2.常用的正規表示式元字元
先介紹乙個概念:元字元metacharacter
所謂元字元就是指那些在正規表示式中具有特殊意義的專用字元,就是下面的紅色的字元。
(1)\b :代表著單詞的開頭或結尾,也就是單詞的分界處,只替換乙個位置
比如要精確找到謀篇文章裡面的hello這個單詞那麼,正規表示式就應該是這個樣子:
\bhello\b
(2). :. 代表匹配除了換行符以外的任意字元
(3)* :它代表的不是字元,也不是位置,而是數量——它指定*
前邊的內容可以連續重複使用任意次以使整個表示式得到匹配。
例子: 要找hello後面不遠的liming這個單詞:
正規表示式為:\bhello\b.*\blucy\b
意思就很明顯了:先是乙個單詞hello然後是任意個任意字元(但不能是換行),最後是liming這個單詞
(4)\d :匹配
一位數字(0,或1,或2,或……)
例子:中國**號碼 形式用正規表示式表達出來:
正規表示式:0\d\d-\d\d\d\d\d\d\d\d (注:-不是元字元,只匹配它本身——連字元(或者減號,或者中橫線,或者隨你怎麼稱呼它)
或者:0\d-\d (注:這裡\d後面的()的意思是前面\d必須連續重複匹配2次(8次)
)(5)\s :匹配任意的空白符,包括空格,製表符(tab),換行符,中文全形空格等
(6)\w :匹配字母或數字或下劃線或漢字等
例子:\ba\w*\b匹配以字母a開頭的單詞——先是某個單詞開始處(\b),然後是字母a,然後是任意數量的字母或數字(\w*),最後是單詞結束處(\b)。
(7)+ :+是和*類似的元字元,不同的是*匹配重複任意次(可能是0次),而+則匹配重複1次或更多次。
例子:\d+匹配1個或更多連續的數字
\b\w\b 匹配剛好6個字元的單詞
(8)^ :
匹配字串的開始
(9)$ :
匹配字串的結束
元字元^(和數字6在同乙個鍵位上的符號)和$都匹配乙個位置,這和\b有點類似。^匹配你要用來查詢的字串的開頭,$匹配結尾。
例子:qq號規定5-12位的數字:^\d$
這裡的和前面介紹過的是類似的,只不過匹配只能不多不少重複2次,則是重複的次數不能少於5次,不能多於12次,否則都不匹配。
因為使用了^和$,所以輸入的整個字串都要用來和\d來匹配,也就是說整個輸入必須是5到12個數字,因此如果輸入的qq號能匹配這個正規表示式的話,
那就符合要求了。
和忽略大小寫的選項類似,有些正規表示式處理工具還有乙個處理多行的選項。如果選中了這個選項,^和$的意義就變成了匹配行的開始處和結束處。
3.字元轉義
如果你想查詢元字元本身的話,比如你查詢
.,或者
*,就出現了問題:你沒辦法指定它們,因為它們會被解釋成別的意思。
這時你就得使用\來取消這些字元的特殊意義。
因此,你應該使用
\.和\*。當然,要查詢\本身,你也得用\\
例如mahuaqun.net 用正規表示式為:mahuaqun\.net
4. 關於代表重複的限定符
(1)*重複零次或更多次
(2)+
重複一次或更多次
(3)?
重複零次或一次
(4)
重複n次
(5)
重複n次或更多次
(6)重複n到m次
例子:windows\d+匹配windows後面跟1個或更多數字
^\w+匹配一行的第乙個單詞(或整個字串的第乙個單詞,具體匹配哪個意思得看選項設定)
5.匹配乙個字元或乙個範圍
[ ] :
(1)匹配括號裡面的任何乙個字元
例子: [aeiou] :就匹配任何乙個英文母音字母
[.?!]匹配標點符號(.或?或!)
(2)指定乙個範圍
例子:[0-9]代表的含意與\d就是完全一致的:一位數字
[a-z0-9a-z_]也完全等同於\w(如果只考慮英文的話)
下面是乙個更複雜的表示式:\(?0\d[) -]?\d。
「(」和「)」也是元字元,後面會提到,所以在這裡需要使用轉義。
這個表示式可以匹配幾種格式的**號碼,像(010)88886666,或022-22334455,或02912345678等。我們對它進行一些分析吧:首先是乙個轉義字元\(,它能出現0次或1次(?),然後是乙個0,後面跟著2個數字(\d),然後是)或-或空格中的乙個,它出現1次或不出現(?),最後是8個數字(\d)。
6.正規表示式中的「或」
|: |可以把不同的規則分隔開
例子:
0\d-\d|0\d-\d這個表示式能匹配兩種以連字型大小分隔的**號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。
\(0\d\)[- ]?\d|0\d[- ]?\d這個表示式匹配3位區號的**號碼,其中區號可以用小括號括起來,也可以不用,區號與本地號間可以用連字型大小或空格間隔,也可以沒有間隔。你可以試試用分枝條件把這個表示式擴充套件成也支援4位區號的。
7.分組(給字串)
我們已經提到了怎麼重複單個字元(直接在字元後面加上限定符就行了);
但如果想要重複多個字元又該怎麼辦?
你可以用小括號來指定子表示式(也叫做分組),然後你就可以指定這個子表示式的重複次數了,你也可以對子表示式進行其它一些操作(後面會有介紹)。
():分組
例子:(\d\.)\d是乙個簡單的ip位址匹配表示式。要理解這個表示式,請按下列順序分析它:\d匹配1到3位的數字,(\d\.)匹配三位數字加上乙個英文句號(這個整體也就是這個分組)重複3次,最後再加上乙個一到三位的數字(\d)。
注意:ip位址中每個數字都不能大於255
(2[0-4]\d|25[0-5]|[01]?\d\d?)\.)(2[0-4]\d|25[0-5]|[01]?\d\d?)。
理解這個表示式的關鍵是理解2[0-4]\d|25[0-5]|[01]?\d\d?,這裡我就不細說了,你自己應該能分析得出來它的意義。
8.反義
有時需要查詢不屬於某個能簡單定義的字元類的字元。比如想查詢除了數字以外,其它任意字元都行的情況,這時需要用到反義:
\w :匹配任意不是字母,數字,下劃線,漢字的字元
\s :匹配任意不是空白符的字元
\d :匹配任意非數字的字元
\b :匹配不是單詞開頭或結束的位置
[^x] :匹配除了x以外的任意字元
[^aeiou]:匹配除了aeiou這幾個字母以外的任意字元
例子:\s+匹配不包含空白符的字串。
]+>匹配用尖括號括起來的以a開頭的字串。
正規表示式複習
字元描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了regexp 物件的multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束位置...
正規表示式複習
字元描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了regexp物件的multiline屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束位置。如果...
正規表示式複習
為了下列場景中的需求,可以使用正規表示式非常簡單的完成,這就是使用正規表示式的目的 在乙個檔案中,查詢出itcast開頭的語句 在乙個檔案中,找到含有itcast的語句 在乙個檔案中,找到郵箱為163或者126的所有郵件位址 通常正規表示式對字串匹配的時候,可以使用re模組 import re 使用...