[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系列]正則表達式