1. 程式人生 > >[Python 3系列]正則表達式

[Python 3系列]正則表達式

正則表達式

正則表達式,簡稱為regex,是文本模式的描述方法。例如,\d是一個正則表達式,表示一位數字字符,即任何一位0到9的數字。


使用步驟

python中所有正則表達式的函數都在re模塊中。


▎python中使用正則表達式的步驟如下:

①用import re導入正則表達式模塊;

②用re.compile()函數創建一個Regex對象。

③向Regex對象的search()方法傳入想查找的字符串。它返回一個Match對象。

④調用Match對象的group()方法,返回實際匹配文本的字符串。


字符分類

字符類型 字符含義

\d 0到9的任何數字

\D 除0到9的數字以外的任何字符

\w 任何字母、數字或下劃線(單詞)

\W 除字母、數字和下劃線以外的任何字符

\s 空格、制表符或換行符(空白)

\S 除空格、制表符和換行符以外的任何字符


正則表達式符號

? 匹配零次或一次前面的分組

* 匹配零次或多次前面的分組

+ 匹配一次或多次前面的分組

| 匹配多個表達式中的一個

() 使用括號創建"分組"

{n} 匹配n次前面的分組

{n,} 匹配n次或更多前面的分組

{,m} 匹配零次到m次前面的分組

{n,m} 匹配至少n次、至多m次前面的分組

{n,m}?或*?或+? 對前面的分組進行非貪心匹配

^spam 字符串必須以spam開始

spam$ 字符串必須以spam結束

. 匹配所有字符,換行符除外

\d、\w和\s 匹配數字、單詞和空格

\D、\W和\S 匹配出數字、單詞和空格外的所有字符

[abc] 匹配方括號內的任何字符

[^abc] 匹配不在方括號內的任何字符


正則表達式方法

1、compile()

向re.compile()傳入一個字符串值,表示正則表達式,它將返回一個Regex模式對象。

如果要忽略正則表達式字符串中的空白符和註釋,可以傳入變量re.VERBOSE。

如果要不區分大小寫,可以傳入re.IGNORECASE或re.I。

如果要句點字符匹配換行,可以傳入re.DOTALL。

re.compile()函數只接受一個值作為它的第二參數,可以用管道符將變量組合起來,從而繞過這個限制。

>>> import re
>>> phoneNum=re.compile(r‘\d\d\d-\d\d\d\d\d\d\d\d‘)


2、group()

Match對象有一個group()方法,它返回被查找字符串中實際匹配的文本。

添加括號將在正則表達式中創建”分組“。正則表達式字符串中的第一對括號是第1組。第二對括號是第2組。向group()匹配對象方法傳入整數1或2,就可以取得匹配文本的不同部分。向group()方法傳入0或不傳入參數,將返回整個匹配的文本。如果想要一次就獲得所有的分組,就使用groups()方法。

>>> import re
>>> phoneNum=re.compile(r‘(\d\d\d)-(\d\d\d\d\d\d\d\d)‘)
>>> mo=phoneNum.search(‘My number is 021-68000000‘)
>>> print(mo.group(0))
021-68000000
>>> print(mo.group(1))
021
>>> print(mo.group(2))
68000000
>>> print(mo.groups())
(‘021‘, ‘68000000‘)


3、search()

Regex對象的search()方法查找傳入的字符串,尋找該正則表達式的所有匹配。如果字符串中沒有找到該正則表達式模式,search()方法將返回None。如果找到了該模式,search()方法將返回一個Match對象。

>>> import re
>>> phoneNum=re.compile(r‘\d\d\d-\d\d\d\d\d\d\d\d‘)
>>> mo=phoneNum.search(‘My number is 021-68000000‘)
>>> print(mo.group())
021-68000000


4、findall()

search()將返回一個Match對象,包含被查找字符串中的”第一次“匹配的文本,而findall()方法將返回一組字符串,包含被查找字符串中的所有匹配。


▎作為findall()方法的返回結果,有如下兩點需要註意:

①如果調用在一個沒有分組的正則表達式上,例如\d\d\d-\d\d\d-\d\d\d\d,將返回一個匹配字符串的列表,如[‘123-456-7890‘,‘000-000-0000‘]。

②如果調用在一個有分組的正則表達式上,例如(\d\d\d)-(\d\d\d)-(\d\d\d\d),將返回一個字符串的元組的列表,如[(‘123‘,‘456‘,‘7890‘),(‘000‘,‘000‘,‘0000‘)]

>>> import re
>>> phoneNum=re.compile(r‘(\d\d\d)‘)
>>> phoneNum.search(‘68000000‘)
<_sre.SRE_Match object; span=(0, 3), match=‘680‘>
>>> phoneNum.findall(‘68000000‘)
[‘680‘, ‘000‘]


5、sub()

sub()方法需要傳入兩個參數。第一個參數是一個字符串,用於取代發現的匹配。第二個參數是一個字符串,即正則表達式。sub()方法返回替換完成後的字符串。

>>> import re
>>> phoneNum=re.compile(r‘021-6800‘)
>>> phoneNum.sub(‘8800‘,‘My number is 021-68000000.‘)
‘My number is 88000000.‘


貪心與非貪心

python的正則表達式默認是”貪心“的,這表示在有二義的情況下,它們會盡可能匹配最長的字符串。花括號的”非貪心“版本匹配盡可能短的字符串,即在結束的花括號後跟一個問號。

問號在正則表達式中可能有兩種含義:聲明非貪心匹配或表示可選的分組。這兩種含義是完全無關的。

>>> import re
>>> phoneNum01=re.compile(r‘(\d\d\d){1,3}‘)
>>> phoneNum02=re.compile(r‘(\d\d\d){1,3}?‘)
>>> mo01=phoneNum01.search(‘68000000‘)
>>> mo02=phoneNum02.search(‘68000000‘)
>>> mo01.group()
‘680000‘
>>> mo02.group()
‘680‘


本文出自 “亂碼時代” 博客,請務必保留此出處http://juispan.blog.51cto.com/943137/1949567

[Python 3系列]正則表達式