正则表达式是搜索、替换和解析复杂字符串的一种强大而标准的方法,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”)) #
(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)) #
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函数分组,得到正确的电话号码。