前言
正規表示式是對字串(包括普通字元(例如,a 到 z 之間的字母)和特殊字元(稱為“元字元”))操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯。正規表示式是一種文字模式,該模式描述在搜尋文字時要匹配的一個或多個字串。
上面都是官方的說明,博主自己的理解是(僅供參考):通過事先規定好一些特殊字元的匹配規則,然後利用這些字元進行組合來匹配各種複雜的字串場景。比如現在的爬蟲和資料分析,字串校驗等等都需要用到正規表示式來處理資料。
python的正規表示式則是re模組了。
re 模組使 Python 語言擁有全部的正規表示式功能。
re 模組也提供了與這些方法功能完全一致的函式,這些函式使用一個模式字串做為它們的第一個引數。
基本語法
編號 |
表示式 |
描述 |
1 |
a, X, 9, < |
普通字元完全匹配。 |
2 |
. |
匹配任何單個字元,除了換行符’\n‘ |
3 |
\w |
匹配“單詞”字元:字母或數字或下劃線[a-zA-Z0-9_]。 |
4 |
\W |
匹配任何非字詞。 |
5 |
\b |
字詞與非字詞之間的界限 |
6 |
\s |
匹配單個空格字元 - 空格,換行符,返回,製表符 |
7 |
\S |
匹配任何非空格字元。 |
8 |
\t, \n, \r |
製表符,換行符,退格符 |
9 |
\d |
十進位制數[0-9] |
10 |
^ |
匹配字串的開頭 |
11 |
$ |
匹配字串的末尾 |
12 |
\ |
抑制字元的“特殊性”,也叫轉義字元。 |
1.match函式
只從字串的最開始與pattern進行匹配
下面是函式的語法 -
re.match(pattern, string, flags = 0)
這裡是引數的描述 -
pattern - 這是要匹配的正規表示式。
string - 這是字串,它將被搜尋用於匹配字串開頭的模式。
flags - 可以使用按位OR(|)指定不同的標誌。 這些是修飾符,如下表所列。
re.match 函式在成功時返回匹配物件,失敗時返回None。使用match(num)或groups()函式匹配物件來獲取匹配的表示式。
編號 |
匹配物件 |
描述 |
1 |
group(num = 0) |
此方法返回整個匹配(或特定子組num) |
2 |
groups() |
此方法返回一個元組中的所有匹配子組(如果沒有,則返回為None) |
示例
import re
line = 'i can speak good english'
matchObj = re.match(r'\s(\w*)\s(\w*).*',line)
if matchObj:
print('matchObj.group() :',matchObj.group())
print('matchObj.group() :',matchObj.group(1))
print('matchObj.group() :',matchObj.group(2))
print('matchObj.group() :',matchObj.group(3))
else:
print('no match!')
import re
line = 'i can speak good english'
matchObj = re.match(r'(i)\s(\w*)\s(\w*).*',line)
if matchObj:
print('matchObj.group() :',matchObj.group())
print('matchObj.group() :',matchObj.group(1))
print('matchObj.group() :',matchObj.group(2))
print('matchObj.group() :',matchObj.group(3))
else:
print('no match!')
2.search函式
與match()工作的方式一樣,但是search()不是從最開始匹配的,而是從任意位置查詢第一次匹配的內容。
下面是這個函式的語法 -
re.match(pattern, string, flags = 0)
這裡是引數的描述 -
pattern - 這是要匹配的正規表示式。
string - 這是字串,它將被搜尋用於匹配字串開頭的模式。
flags - 可以使用按位OR(|)指定不同的標誌。 這些是修飾符,如下表所列。
re.search函式在成功時返回匹配物件,否則返回None。使用match物件的group(num)或groups()函式來獲取匹配的表示式。
編號 |
匹配物件 |
描述 |
1 |
group(num = 0) |
此方法返回整個匹配(或特定子組num) |
2 |
groups() |
此方法返回一個元組中的所有匹配子組(如果沒有,則返回為None) |
示例
import re
line = 'i can speak good english'
matchObj = re.search('(.*) (.*?) (.*)',line)
if matchObj:
print('matchObj.group() :',matchObj.group())
print('matchObj.group() :',matchObj.group(1))
print('matchObj.group() :',matchObj.group(2))
print('matchObj.group() :',matchObj.group(3))
else:
print('no match!')
3.sub()函式
使用正規表示式re模組中的最重要的之一是sub。
模組
re.sub(pattern, repl, string, max=0)
此方法使用repl替換所有出現在RE模式的字串,替換所有出現,除非提供max。此方法返回修改的字串。
示例
import re
line = 'i can speak good english'
speak = re.sub(r'can','not',line)
print(speak)
speak1 = re.sub(r'\s','',line) #替換所有空格
print(speak1)
特殊語法示例
字元類
編號 |
示例 |
說明 |
1 |
[Pp]ython |
匹配“Python”或“python” |
2 |
rub[ye] |
匹配“ruby”或“rube” |
3 |
[aeiou] |
匹配任何一個小寫母音 |
4 |
[0-9] |
匹配任何數字; 如[0123456789] |
5 |
[a-z] |
匹配任何小寫ASCII字母 |
6 |
[A-Z] |
匹配任何大寫的ASCII字母 |
7 |
[a-zA-Z0-9] |
匹配上述任何一個 |
8 |
[^aeiou] |
匹配除小寫母音之外的任何東西 |
9 |
[^0-9] |
匹配數字以外的任何東西 |
特殊字元類
編號 |
示例 |
說明 |
1 |
. |
匹配除換行符以外的任何字元 |
2 |
\d |
匹配數字:[0-9] |
3 |
\D |
匹配非數字:[^0-9] |
4 |
\s |
匹配空格字元:[\t\r\n\f] |
5 |
\S |
匹配非空格:[^\t\r\n\f] |
6 |
\w |
匹配單字字元: [A-Za-z0-9_] |
7 |
\W |
匹配非單字字元: [A-Za-z0-9_] |
重複匹配
編號 |
示例 |
說明 |
1 |
ruby? |
匹配“rub”或“ruby”:y是可選的 |
2 |
ruby* |
匹配“rub”加上0個以上的y |
3 |
ruby+ |
匹配“rub”加上1個或更多的y |
4 |
\d{3} |
完全匹配3位數 |
5 |
\d{3,} |
匹配3位或更多位數字 |
6 |
\d{3,5} |
匹配3,4或5位數 |
非貪婪重複
這匹配最小的重複次數 -
編號 |
示例 |
說明 |
1 |
<.*> |
貪婪重複:匹配“ perl>” |
2 |
<.*?> |
非貪婪重複:在“ perl”中匹配“” |
用圓括號分組
編號 |
示例 |
說明 |
1 |
\D\d+ |
沒有分組:+重複\d |
2 |
(\D\d)+ |
分組:+重複\D\d對 |
3 |
([Pp]ython(,)?)+ |
匹配“Python”,“Python,python,python”等 |
反向引用
這與以前匹配的組再次匹配 -
編號 |
示例 |
說明 |
1 |
([Pp])ython&\1ails |
匹配python和pails或Python和Pails |
2 |
(['"])[^\1]*\1 |
單引號或雙引號字串。\1匹配第一個分組匹配。 \2匹配任何第二個分組匹配等 |
3 |
python |
perl |
4 |
rub(y |
le) |
5 |
Python(!+ |
?) |
錨點
這需要指定匹配位置。
編號 |
示例 |
說明 |
1 |
^Python |
在字串或內部行的開頭匹配“Python” |
2 |
Python$ |
在字串或內部行的結尾匹配“Python” |
3 |
\APython |
在字串的開頭匹配“Python” |
4 |
Python\Z |
在字串的末尾匹配“Python” |
5 |
\bPython\b |
在字詞的邊界匹配“Python” |
6 |
\brub\B |
\B是非字詞邊界:在“rube”和“ruby”中匹配“rub”,而不是單獨匹配 |
7 |
Python(?=!) |
匹配“Python”,如果跟著感嘆號。 |
8 |
Python(?!!) |
匹配“Python”,如果沒有感嘆號後面。 |
帶括號的特殊語法
編號 |
示例 |
說明 |
1 |
R(?#comment) |
匹配“R”。其餘的都是註釋 |
2 |
R(?i)uby |
匹配“uby”時不區分大小寫 |
3 |
R(?i:uby) |
同上 |
4 |
rub(?:yle)) |
僅組合而不建立\1反向引用 |