正規表示式是一種用來匹配字串的強有力的**。它的設計思想是用一種描述性的語言來給字串定義乙個規則,凡是符合規則的字串,我們就認為它「匹配」了,否則,該字串就是不合法的。
1、直接給出字元,精確匹配;
2、\d可以
匹配乙個數字;
3、\w
可以匹配乙個字母或數字;
4、. 可以匹配任意字元;
5、用 *
表示任意個字元(包括0個);
6、用 + 表示至少乙個字元;
7、用 ? 表示0個或1個字元,也可以用來表示非貪婪匹配;
8、用 表示n個字元,用 表示 n-m 個字元;
9、\s可以匹配乙個空格(包括tab等空白符);
10、對特殊字元(如'-'),要用 '\'轉義。
看如下的例子:
'00\d' 可匹配'001',但不能匹配 '00d';
'\d\d\d'可匹配'123';
'\d\w\w'可匹配'3gp';
'pi.'可以匹配'pip'、'pio'、'pi3'等;
'\d\s+\d'進行分析:\d表示匹配4個數字,如'0376';\s+表示至少有乙個空格,如匹配' '、' '等;\d表示5-8個數字,如'9876543'。
1、可以使用[ ]進行更精確的匹配 ,如
(1)[0-9a-za-z\_]可以匹配乙個數字、字母或下劃線;
(2)[0-9a-za-z\_]+可以匹配至少由乙個數字、字母或下劃線組成的字串,如'1bd'、'd_q0'、'_hi'等;
(3)[a-za-z\_][0-9a-za-z\_]*可以匹配由字母或下劃線開頭、後接任意個由數字、字母或下劃線組成的字串,這是python中合法變數的命名規則;
(4)[a-za-z\_][0-9a-za-z\_]對變數的長度進行更精確的限制。
2、| 可以表示選擇性匹配,如a|b可匹配a或b,故(p|p)ython可以匹配'python'或'python';
3、^表示行的開頭,$表示行的結束,^\d表示必須以數字開頭,\d$表示必須以數字結尾。
python提供了re模組,包含所有正規表示式功能,因python字串本身使用\轉義,故強烈推薦使用python的r字首,這樣在正規表示式字串中不需要考慮轉義的問題了。
在re模組中,match可判斷字串與正規表示式是否匹配,若匹配成功,則返回乙個match物件,否則返回none,如:
in [7]: import re
in [8]: re.match(r'^\d\-\d$', '0376-987654')
out[8]: <_sre.sre_match object; span=(0, 11), match='0376-987654'>
in [9]: re.match(r'^\d\-\d$', '0376- 987654')
in [10]:
使用正規表示式進行字串的切分,比使用固定的字元更靈活,請看下面幾個例子:
正常的切分:
in [10]: 'a,b,,,c'.split(',')
out[10]: ['a', 'b', '', '', 'c']
無法正確的將a, b, c區分開來,下面使用正規表示式進行切分:
in [13]: re.split(r'[\,]+','a,b,,,c')
out[13]: ['a', 'b', 'c']
不論有幾個','都可以正常的分割,下面加入空格及';',都可以正常的切分:
in [14]: re.split(r'[\,\s]+','a ,b , , , c')
out[14]: ['a', 'b', 'c']
in [15]: re.split(r'[\,\;\s]+','a ;,b , ;, , c')
out[15]: ['a', 'b', 'c']
可以使用正規表示式進行字串的分組,用()表示的就是要提取的分組(group),如:
^(\d)-(\d)$定義了兩個組,可以從中直接提取出區號和本地號碼:
in [16]: g = re.match(r'^(\d)-(\d)$','0376-987654')
in [17]: g
out[17]: <_sre.sre_match object; span=(0, 11), match='0376-987654'>
in [18]: g.group(0)
out[18]: '0376-987654'
in [19]: g.group(1)
out[19]: '0376'
in [20]: g.group(2)
out[20]: '987654'
若是在正規表示式中定義了組,就可以在match物件上用group()提取出字串,需要說明的是:
group(0)表示原始字串,group(1)、group(2)...依次表示第1、2個字串。提取字串在實際中非常有用,下面是乙個提取時間中時分秒的示例:
in [22]: t = '18:57:45'
in [23]: m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9
...: ]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
in [24]: m.groups()
out[24]: ('18', '57', '45')
正規表示式是貪婪匹配的,何為貪婪?就是盡可能多的匹配,如在下面的例子中,會匹配數字後面的'1':
in [25]: re.match(r'^(\d+)(1*)$','12098111111').groups()
out[25]: ('12098111111', '')
這是因為\d+採用貪婪匹配,把後面的1全部匹配了,所有1*只能匹配空字串。讓\d+採用非貪婪匹配(即盡可能少的匹配),才可以把後面的1匹配出來,加?就可以讓\d+採用非貪婪匹配的模式,看下面的示例:
in [26]: re.match(r'^(\d+?)(1*)$','12098111111').groups()
out[26]: ('12098', '111111')
在python中使用正規表示式,re模組內部有兩個操作:
(1)編譯正規表示式,若正規表示式語法有錯誤,則會報錯;
(2)用編譯後的正規表示式匹配字串。
若乙個正規表示式要重複使用成千上萬次,從效率的角度考慮,應對正規表示式進行預編譯,後面使用的時候就不需要警經歷編譯這個步驟,而是直接進行匹配,請看下面的示例:
in [28]: import re
in [29]: re_tel = re.compile(r'^(\d)-(\d)$')
in [30]: re_tel.match('0123-12345').groups()
out[30]: ('0123', '12345')
in [31]: re_tel.match('0371-12090945').groups()
out[31]: ('0371', '12090945')
正規表示式編譯後生成 正規表示式物件(regular expression),已包含正規表示式,所以呼叫時不需給出正規表示式。
以上是正規表示式的基本知識,因為最近用的比較多,所以把廖雪峰老師的教程總結在此,便於以後用到時檢視。
參考文獻:廖雪峰-正規表示式
正規表示式及其應用
1.正規表示式及其應用 定義 正規表示式 regular expression 描述了一種字串匹配的模式,可以用來檢查乙個串是否含有某種子串 將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。正規表示式常用字元 1 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進...
正規表示式及其應用 2
1.伺服器端正規表示式驗證 開發 的時候,經常會用到伺服器端對表單的驗證,如email格式是否合法,只允許輸入數字等等,php中進行正則驗證主要是利用preg match 函式。示例 如下 function is email str function is url str function is q...
python 正規表示式應用
usr bin env python coding utf 8 乙個小爬蟲 其中用的規則是 src jpg pic ext 可是這樣會出現問題 如 網頁源 中會有這樣的串 情況一 引用非jpg的標籤後連著乙個引用jpg的標籤 匹配出來的url pic ext png width 30 height ...