Python筆記 正規表示式

2021-07-30 16:48:23 字數 2837 閱讀 6875

1、如果直接給出字元,就是精確匹配。用\d可以匹配乙個數字,\w可以匹配乙個字母或數字,.可以匹配任意字元

'00\d'   可以匹配'007',但無法匹配'00a';

'\d\d\d' 可以匹配'010';

'\w\w\d' 可以匹配'py3';

'py.' 可以匹配'pyc'、'pyo'、'py!'

2、要匹配變長的字元,在正規表示式中,用*表示任意個字元(包括0個),用+表示至少乙個字元,用?表示0個或1個字元,用表示n個字元,用表示n-m個字元

\d\s+\d

\d匹配3個數字,例如'010';

\s 匹配1個空格(也包括tab等空白符),所以\s+表示至少有乙個空格,例如匹配' ',' '等;

\d匹配3-8個數字,例如'1234567'.

所以,上面的正規表示式可匹配以任意空格隔開的帶區號的**號碼.

3、』-『是特殊字元,在正規表示式中,要用』\』轉義

4、要做更精確地匹配,可以用表示範圍,比如:

[0-9a-za-z\_] 可以匹配乙個數字、字母或者下劃線;

[0-9a-za-z\_]+ 可以匹配至少由乙個數字、字母或者下劃線組成的字串,比如'a100','0_z','py3000'等等;

[a-za-z\_][0-9a-za-z\_]* 可以匹配由字母或下劃線開頭,後接任意個由乙個數字、字母或者下劃線組成的字串,也就是python合法的變數;

[a-za-z\_][0-9a-za-z\_] 更精確地限制了變數的長度是1-20個字元(前面1個字元+後面最多19個字元);

a|b 可以匹配a或b,所以(p|p)ython可以匹配'python'或者'python';

^ 表示行的開頭,^\d 表示必須以數字開頭;

$ 表示行的結束,\d$ 表示必須以數字結束.

所以,py也可以匹配 『python』,但是加上 ^py$ 就變成了整行匹配,就只能匹配 『py』 了。

5、python提供re模組,包含所有正規表示式的功能。由於python的字串本身也用\轉義,所以要特別注意:

s = 'abc\\-001'

# python的字串

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

# 'abc\-001'

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

s = r'abc\-001'

# python的字串

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

# 'abc\-001'

6、判斷正規表示式是否匹配:

#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')

>>>

常見的判斷方法就是:

test = '使用者輸入的字串'

if re.match(r'正規表示式', test):

print('ok')

else:

print('failed')

7、用()表示的就是要提取的分組(group)

# ^(\d)-(\d)$ 分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼:

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

>>>m.group(0)

'010-12345'

>>>m.group(1)

'010'

>>> m.group(2)

'12345'

注意到group(0)永遠是原始字串,group(1)、group(2)……表示第1、2、……個子串。

8、正則匹配預設是貪婪匹配,也就是匹配盡可能多的字元。

#貪婪匹配,匹配出數字後面的0:

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

('102300', '')

\d+採用貪婪匹配,直接把後面的0全部匹配了,結果0*只能匹配空字串了。

#非貪婪匹配(加個?),匹配出數字後面的0:

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

('1023', '00')

9、如果乙個正規表示式要重複使用幾千次,出於效率的考慮,我們可以預編譯該正規表示式,接下來重複使用時就不需要編譯這個步驟了,直接匹配:

>>> 

import re

# 編譯:

>>> re_telephone = re.compile(r'^(\d)-(\d)$')

# 使用:

>>> re_telephone.match('010-12345').groups()

('010', '12345')

>>> re_telephone.match('010-8086').groups()

('010', '8086')

Python 正規表示式筆記

python 正規表示式筆記 正規表示式的先行斷言 lookahead 和後行斷言 lookbehind 正規表示式的先行斷言和後行斷言一共有4種形式 pattern 零寬正向先行斷言 zero width positive lookahead assertion pattern 零寬負向先行斷言 ...

Python 正規表示式 筆記

re 庫的 match 物件 re 庫的貪婪匹配和最小匹配 re,regex,regular expression 用簡潔形式表示了一組字串的特徵或模式,通用的字串表達框架。用前需要編譯,正規表示式由字元和操作符組成。表示任何單個字元 字符集,對單個字元給出取值範圍 非字符集,對單個字元給出排除範圍...

python正規表示式筆記

更新中 正規表示式 regular expression 也簡稱regex,是用於簡潔表達一組字串的表示式。例1 對於字串組 pn pyn pytn pythn python 可以用正規表示式p y yt yth ytho n表示 例2 對於字串組 py pyy pyyy pyyyy pyyyy 可...