python正規表示式及其應用

2021-08-20 07:01:01 字數 3817 閱讀 1693

正規表示式是一種用來匹配字串的強有力的**。它的設計思想是用一種描述性的語言來給字串定義乙個規則,凡是符合規則的字串,我們就認為它「匹配」了,否則,該字串就是不合法的。

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 ...