正则表达式是搜索、替换息争析巨大字符串的一种强大而尺度的要领,Python中的正则相关的对象全在re模块下。
1 常用的匹配
^匹配字符串的开始
$匹配字符串的末了
\b匹配一个单词的界线
\d匹配任意数字
\D匹配任意非数字字符
x?匹配一个可选的x(匹配1次或0次x字符)
x*匹配0次或多次x
x+匹配1次或多次x
x{n,m}至少n次,至多m次x
(a|b|c)要么匹配a,要么匹配b,要么匹配c
(x)一般环境下暗示一个影象组,你可以操作re.search函数返回工具的groups()函数来获取它的值
2 一般用途
#------------------------------------------------------------------------------- # coding: utf-8 # Purpose:正则表达式 # # Author: zdk # # Created: 26/02/2013 # Copyright: (c) zdk 2013 #------------------------------------------------------------------------------- import re if __name__ == '__main__': addr = "100 BROAD ROAD APT.3" print(re.sub("ROAD","RD",addr)) # 100 BRD RD APT.3 print(re.sub(r"\bROAD\b","RD",addr)) # 100 BROAD RD APT.3 pattern = ".*B.*(ROAD)?" print(re.search(pattern,"ROAD")) #None print(re.search(pattern,"B")) #<_sre.SRE_Match object at 0x0230F020><span style="background-color:#FAFAFA;font-family:Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace;font-size:1em;line-height:1.5;"> </span>
(1)re.sub("ROAD","RD",addr) 操作re.sub函数对字符串addr举办搜索,满意表达式"ROAD"的用“RD”替换
(2)re.sub(r"\bROAD\b","RD",addr) ,“\b”寄义是“单词的界线”,在Python中,由于字符“\”在字符串中必需转义,这会变得很是贫苦,所以Python用前缀r暗示字符串中的所有字符都不转义。
(3)re.search(pattern,"ROAD") re模块有一个search函数,该函数有两个参数,一个是正则表达式,一个是字符串,search函数返回一个拥有多种要领可以描写这个匹配的工具,假如没有发明匹配,则返回None。
3 松散正则表达式
上面均是“紧凑”范例的表达式,它较量难以阅读,纵然此刻清楚表达式的寄义,也不能担保几个月后还能记得。所以Python答允用户操作所谓的松散正则表达式来完成内联文档的需要,和一般的表达式有以下两个方面的主要区别
忽略空缺符。空格符、制表符、回车符不匹配它们自身(假如你想在松散正则表达式中匹配一个空格符,你不须在它前面添加一个反斜杠标记对它举办转义)
忽略注释。和普通的Python代码一样,注释开始于#标记,竣事于行尾。
#松散带有内联注释的正则表达式 pattern = """ ^ # begin of string M{0,3} # 0 to 3 M (CM|CD|D?C{0,3}) #CM or CD or D or D 0 to 3 C $ #end of string """ print(re.search(pattern,"MCM",re.VERBOSE)) #<_sre.SRE_Match object at 0x021BAF60> print(re.search(pattern,"M99",re.VERBOSE)) #None
(1)当利用松散正则表达式时,最重要的一件事就是:必需通报一个特另外参数re.VERBOSE,它是re模块的一个常量,符号着待匹配的正则表达式是一个松散正则表达式。pattern的空格和注释都是被忽略的,但同时具有更好的可读性。
4 个例研究:理会电话号码
必需匹配如下电话号码:
800-555-1212
800 555 1212
800.555.1212
(800)555-1212
1-800-555-1212
800-555-1212-1234
800-555-1212×1234
800-555-1212 ext.1234
work 1-(800) 555,1212 #1234
名目较量多,我们需要知道的是800为区号,干线号为555,电话号的其他数字为1212,对付有分机号的,我们需要知道分机号为1234
phonePattern = re.compile(r''' # don't match beginging of string (\d{3}) # 3 digits \D* #any number of non-digits (\d{3}) # 3 digits \D* #any number of non-digits (\d{4}) # 4 digits \D* #any number of non-digits (\d*) #any number of digits ''',re.VERBOSE) print(phonePattern.search('work 1-(800)555.1212 #1234').groups()) #('800', '555', '1212', '1234')
print(phonePattern.search('work 1-(800)555.1212 #1234').groups()) #('800', '555', '1212', '1234')
(1)一个松散正则表达式如上, 首先匹配3个数字区号(不必然从第一个字符开始,所以没有用^),接着后头匹配任意多个非数字的字符,接着匹配3个数字干线号,接着匹配任意多个非数字的字符,接着匹配4个数字号码,接着匹配任意多个非数字的字符,接着匹配任意多个数字的分机号,然后用groups函数分组,获得正确的电话号码。