Python學習筆記(七)正規表示式

2021-09-23 22:37:47 字數 4261 閱讀 7621

在編寫處理字串的程式或網頁時,經常會有查詢符合某些複雜規則的字串的需要,正規表示式就是用於描述這些規則的工具,換句話說正規表示式是一種工具,它定義了字串的匹配模式(如何檢查乙個字串是否有跟某種模式匹配的部分或者從乙個字串中將與模式匹配的部分提取出來或者替換掉)。

下表為正規表示式主要的符號語法:

符號解釋

示例說明

.匹配任意字元

b.t可以匹配bat / but / b#t / b1t等

\w匹配字母/數字/下劃線

b\wt

可以匹配bat / b1t / b_t等

但不能匹配b#t

\s匹配空白字元(包括\r、\n、\t等)

love\syou

可以匹配love you

\d匹配數字

\d\d

可以匹配01 / 23 / 99等

\b匹配單詞的邊界

\bthe\b

^匹配字串的開始

^the

可以匹配the開頭的字串

$匹配字串的結束

.exe$

可以匹配.exe結尾的字串

\w匹配非字母/數字/下劃線

b\wt

可以匹配b#t / b@t等

但不能匹配but / b1t / b_t等

\s匹配非空白字元

love\syou

可以匹配love#you等

但不能匹配love you

\d匹配非數字

\d\d

可以匹配9a / 3# / 0f等

\b匹配非單詞邊界

\bio\b

匹配來自字符集的任意單一字元

[aeiou]

可以匹配任一母音字母字元

[^]匹配不在字符集中的任意單一字元

[^aeiou]

可以匹配任一非母音字母字元

*匹配0次或多次

\w*+

匹配1次或多次

\w+?

匹配0次或1次

\w?匹配n次

\w匹配至少m次

\w匹配至少m次至多n次\w|

分支foo|bar

可以匹配foo或者bar

(?#)

注釋(exp)

匹配exp並捕獲到自動命名的組中

(? exp)

匹配exp並捕獲到名為name的組中

(?:exp)

匹配exp但是不捕獲匹配的文字

(?=exp)

匹配exp前面的位置

\b\w+(?=ing)

可以匹配i'm dancing中的danc

(?<=exp)

匹配exp後面的位置

(?<=\bdanc)\w+\b

可以匹配i love dancing and reading中的第乙個ing

(?!exp)

匹配後面不是exp的位置

(?匹配前面不是exp的位置

*?重複任意次,但盡可能少重複

a.*b

a.*?b

將正規表示式應用於aabab,前者會匹配整個字串aabab,後者會匹配aab和ab兩個字串

+?重複1次或多次,但盡可能少重複

??重複0次或1次,但盡可能少重複

?重複m到n次,但盡可能少重複

?重複m次以上,但盡可能少重複

例:\d\-\d匹配像 '010-12345' 這樣的**號碼

python提供re模組,包含所有正規表示式的功能。下面是re模組中的核心函式:

函式說明

compile(pattern, flags=0)

編譯正規表示式返回正規表示式物件

match(pattern, string, flags=0)

用正規表示式匹配字串 成功返回匹配物件 否則返回none

search(pattern, string, flags=0)

搜尋字串中第一次出現正規表示式的模式 成功返回匹配物件 否則返回none

split(pattern, string, maxsplit=0, flags=0)

用正規表示式指定的模式分隔符拆分字串 返回列表

sub(pattern, repl, string, count=0, flags=0)

用指定的字串替換原字串中與正規表示式匹配的模式 可以用count指定替換的次數

fullmatch(pattern, string, flags=0)

match函式的完全匹配(從字串開頭到結尾)版本

findall(pattern, string, flags=0)

查詢字串所有與正規表示式匹配的模式 返回字串的列表

finditer(pattern, string, flags=0)

查詢字串所有與正規表示式匹配的模式 返回乙個迭代器

purge()

清除隱式編譯的正規表示式的快取

re.i / re.ignorecase

忽略大小寫匹配標記

re.m / re.multiline

多行匹配標記

由於python的字串也存在轉義,故建議採用r字首:

s = r'abc\-001' # python的字串

# 對應的正規表示式字串不變:

# 'abc\-001'

match()方法判斷是否匹配,如果匹配成功,返回乙個match物件,否則返回none。判斷正規表示式是否匹配:

>>> import re

>>> re.match(r'^\d\-\d$', '010-12345')

<_sre.sre_match object; span=(0, 9), match='010-12345'>

>>> re.match(r'^\d\-\d$', '010 12345')

none

用正規表示式切分字串比用固定的字元更靈活,正常的切分**:

>>> 'a b   c'.split(' ')

['a', 'b', '', '', 'c']

正規表示式的切分**:

>>> re.split(r'\s+', 'a b   c')

['a', 'b', 'c']

>>> re.split(r'[\s\,]+', 'a,b, c d')

['a', 'b', 'c', 'd']

正規表示式還有提取子串的強大功能。用()表示的就是要提取的分組(group)。比如:^(\d)-(\d)$分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼:

>>> m = re.match(r'^(\d)-(\d)$', '010-12345')

>>> m

<_sre.sre_match object; span=(0, 9), match='010-12345'>

>>> m.group(0)

'010-12345'

>>> m.group(1)

'010'

>>> m.group(2)

'12345'

如果正規表示式中定義了組,就可以在match物件上用group()方法提取出子串來。注意到group(0)永遠是原始字串,group(1)group(2)……表示第1、2、……個子串。

需要特別指出的是,正則匹配預設是貪婪匹配,也就是匹配盡可能多的字元。舉例如下,匹配出數字後面的0

>>> re.match(r'^(\d+)(0*)$', '102300').groups()

('102300', '')

由於\d+採用貪婪匹配,直接把後面的0全部匹配了,結果0*只能匹配空字串了。必須讓\d+採用非貪婪匹配(也就是盡可能少匹配),才能把後面的0匹配出來,加個?就可以讓\d+採用非貪婪匹配:

>>> re.match(r'^(\d+?)(0*)$', '102300').groups()

('1023', '00')

正則表達學習筆記

b代表字串必須以b開頭 3 代表必須以3結尾 代表任意字元 代表前面字元可以重複任意多次 1 代表1至少出現一次 w.w w與w中間的字元出現2次 最少3次 最少3次,最多6次 import re line wuwei123 regex str w.3 if re.match regex str,l...

python正則表達學習

python替換 主要是利用 python 的正則表達,python的正則表達功能比較強大。我就介紹下我經常用的幾個方法。可能說的詳細,如果要深入研究的話。還是 要去看下python的文件了.廢話不多說。馬上開始介紹 一般我會用re.compile來建立乙個正則物件。python 文件上介紹好象這個...

正規表示式學習筆記 python

import re re.findall pattern,string,flags 0 pattern 指的是,正規表示式匹配規則 string 指的是,要進行匹配的字串 flags 指的是,可選引數,進行特定條件的匹配,如能讓匹配時不區分大小寫的re.i和能讓元字元.匹配 n的re.s match...