Python學習 16 正規表示式

2021-07-26 18:07:09 字數 3520 閱讀 2475

正規表示式是一種描述性的語言,用來匹配字串。凡是符合規則的字串,我們認為就是匹配了。

正規表示式並非python獨有的,它與語言無關。很多語言都支援正規表示式。

我們經常用正規表示式來匹配電子郵件、手機號碼、url等等。

來看乙個簡單的正規表示式,用於匹配手機號碼:

^1[35789]\d$
表示匹配以1開頭,第二位是3或5或7或8或9,後面9位是數字,且後面必須以9位數字結尾。滿足該規則的手機號就說明匹配該正則了。

python裡re模組包含所有正規表示式的功能。

注意:由於python的字串本身也用\轉義,所以要特別注意:

s = 'abc\\'

# 對應的正規表示式字串變成:'abc\'

使用python的r字首,就不用考慮轉義的問題了:

s = r'abc\'

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

上面的正則用python寫則是:

import re

m = re.match(r'^1[35789]\d

$', '13271222223')

print(m)

m = re.match(r'^1[35789]\d

$', '23271222223')

print(m)

輸出:

<_sre.sre_match object; span=(0, 11), match='13271222223'>

none

發現第二個例子匹配結果是none。python中re模組match()方法判斷是否匹配,如果匹配成功,返回乙個match物件,否則返回none

所以我們可以寫如下判斷**:

import re

if re.match(r'^1[35789]\d

$', '13271222223'):

print('ok')

else:

print('not match')

輸出:

ok
\d屬於元字元。

常用的元字元:

**說明

.匹配除換行符以外的任意字元

\w匹配字母或數字或下劃線或漢字

\s匹配任意的空白符

\d匹配數字

\b匹配單詞的開始或結束

^匹配字串的開始

$匹配字串的結束

屬於重複限定符。

常用的限定符:

**/語法說明*

重複0次或更多次

+重複1次或更多次

?重複0次或1次

重複n次

重複n次或更多次

重複n到m次

[35789]表示匹配3或5或7或8或9中的某乙個。像[aeiou]就匹配任何乙個英文母音字母,[.?!]匹配標點符號(.或?或!)。

[0-9]代表的含意與\d就是完全一致的:一位數字;同理[a-z0-9a-z_]也完全等同於\w(如果只考慮英文的話)。

re模組裡的split可以代替常規的split。示例:

# coding: utf-8

import re

string =

'abc d e'

print(string.split(' '))

print(re.split(r'\s+', string))

輸出:

['abc', 'd', '', 'e']

['abc', 'd', 'e']

我們發現常規的切分字串無法識別連續的空格,但正則可以。

正規表示式還可以提取子串。用()表示的就是要提取的分組。

(\d\.)\d是乙個簡單的ip位址匹配表示式。要理解這個表示式,可以按順序分析:\d匹配1到3位的數字,(\d\.)匹配三位數字加上乙個英文句號(這個整體也就是這個分組)重複3次,最後再加上乙個一到三位的數字(\d)

import re

m = re.match(r'(\d\.)

\d', '11.22.33.44')

print(m.group(0))

print(m.group(1))

print(m.groups())

輸出:

11.22.33.44

33.('33.',)

group(0)永遠是原始字串,group(1)group(2)……表示第1、2、……個子串。groups()返回所有子串的tuple。

這裡由於只有乙個分組,所以列印group(2)會報錯。

當正規表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配盡可能多的字元。

比如我們要匹配數字102300後面的0

import re

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

print(m.groups())

輸出:

('102300', '')
由於貪婪匹配,\d+會一直匹配到末尾,把整個數字都匹配了,0*就只能匹配空字串了。我們改改:

import re

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

print(m.groups())

輸出:

('1023', '00')
加個?就可以讓\d+採用非貪婪匹配。

懶惰限定符:

**/語法

說明*?

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

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

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

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

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

參考:

1、正規表示式30分鐘入門教程

Python學習 16 正規表示式

正規表示式是一種描述性的語言,用來匹配字串。凡是符合規則的字串,我們認為就是匹配了。正規表示式並非python獨有的,它與語言無關。很多語言都支援正規表示式。我們經常用正規表示式來匹配電子郵件 手機號碼 url等等。來看乙個簡單的正規表示式,用於匹配手機號碼 1 35789 d 表示匹配以1開頭,第...

Python學習 16 正規表示式

正規表示式是一種描述性的語言,用來匹配字串。凡是符合規則的字串,我們認為就是匹配了。正規表示式並非python獨有的,它與語言無關。很多語言都支援正規表示式。我們經常用正規表示式來匹配電子郵件 手機號碼 url等等。來看乙個簡單的正規表示式,用於匹配手機號碼 1 35789 d 表示匹配以1開頭,第...

Python 正規表示式學習(二)正規表示式語法

一,單一字元匹配 1 匹配任意字元 import re res re.match r a.abcd print res.group 列印結果 abc一點.表示匹配任意的字元。上面的 表示匹配a後面的任意兩個字元。必須從a開始。若寫成 b.則會發生錯誤。2 匹配指定字元 如 0 9a za z 表示 ...