1 python正则表达式
python中正则表达式一般使用自带的re模块,本文将简单介绍该模块的使用方法和注意事项。
1.1 原始字符串
在python中使用正则表达式时,建议使用原始字符串,也就是以r开头的字符串,如r"python"
。
1.2 转义字符
在re模块中有一些特殊字符,如.+?\
等,这些字符在正则表达式中有特殊意义。但是让我们需要匹配这些符号时,比如我要匹配字符串中的?
号,这时候就需要使用转义字符了。只需要在这些特殊字符前面加上反斜杠\
就可以了。
比如,r"python\.org"
用来匹配python.org
1.3 数量词的贪婪模式与非贪婪模式
在使用*+?
这这几个表示数量的符号时,默认的情况是贪婪的(尽可能多的匹配字符)。而有时候需要使用非贪婪模式(尽可能少的匹配字符),这时候只需要在这几个符号后边再加一个?
就是非贪婪模式了。例如:
查找字符串"aabbbcc"
贪婪模式下:r"ab*" 将匹配 "aabbb"
非贪婪模式:r"ab*?" 将匹配 "ab"
2 re模块简介
2.1 re模块方法简介
方法 | 描述 |
---|---|
compile(pattern[, flag]) | 根据正则表达式创建匹配对象 |
match(pattern, string[, flag]) | 在字符串开始处开始匹配,返回matchObject或者None |
search(pattern, string[, flag]) | 在字符串中查找模式,返回matchObject或者None |
split(pattern, string[, maxsplit]) | 根据模式的匹配项来分割字符串 |
findall(pattern, string[, flag]) | 以列表的形式返回匹配的所有子串 |
finditer(pattern, string[,flag]) | 返回一个顺序访问每一个匹配结果(matchObject)的迭代器 |
sub(pattern, repl, string[, count]) | 将字符串中的匹配项替换成指定字符串 |
subn(pattern, repl, string[, count]) | 相比于sub方法,多返回一个替换次数 |
2.2 re.compile(pattern[, flag])
主要是将一个正则表达式编译成一个匹配模式对象(pattern),方便后续使用 。因为使用正则表达式匹配字符串时,都需要将正则表达式编译成匹配模式对象(pattern对象)。对于要频繁使用的正则表达式最好先调用compile
方法将其编译好,后续使用时就省去了编译的时间。其中flag
参数主要有如下选项:
flag | 描述 |
---|---|
re.I | 忽略大小写 |
re.M | 多行模式 |
re.S | 点任意匹配模式 |
re.L | 使预定义字符类 \w \W \b \B \s \S 取决于当前区域设定 |
re.U | 使预定义字符类 \w \W \b \B \s \S 取决于unicode定义的字符属性 |
re.X | 详细模式,正则表达式可以是多行的,忽略空白字符,可以加注释 |
2.3 re.match(pattern[, flag])
从string的开头开始匹配,如果成功返回一个matchObject,否则返回None。matchObject提供如下属性和方法,来获取匹配的子串的信息:
方法与属性 | 描述 |
---|---|
string | 匹配时使用的字符串 |
re | 匹配时使用的pattern对象 |
pos | 文本中正则表达式开始搜索的索引 |
endpos | 最后一个被捕获的分组在文本中的索引,默认为None |
lastgroup | 最后一个被捕获的分组的别名 |
group([g1, g2, ...]) | 获得一个或者多个分组截获的字符串;指定多个参数时,以元组形式返回;g1可以使用编号也可以使用别名,其中编号0表示整个匹配的子串;默认返回None |
groups() | 以元组的形式返回全部分组截获的字符串 |
groupdict() | 返回以有别名的组的别名为键、以组截获的字符串为值的字典,不包含没有别名的 |
start([g]) | 返回指定的组截获的字串在string中的开始索引,group默认为0 |
end([g]) | 返回指定的组截获的字串在string中的结束索引(最后一个字符索引+1),group默认为0 |
span([g]) | 返回(start([group]), end([group])) |
expand(template) | 将匹配的分组带入tmplate中返回 |
例程如下:
>>> ptn = re.compile(r"(\w+) (\w+)(?P<sign>.*)")
>>> m = ptn.match("hello world!")
>>> print "m.string:", m.string
m.string: hello world!
>>> print "m.re:", m.re
m.re: <_sre.SRE_Pattern object at 0x10af6c030>
>>> print "m.pos:", m.pos
m.pos: 0
>>> print "m.endpos:", m.endpos
m.endpos: 12
>>> print "m.lastindex:", m.lastindex
m.lastindex: 3
>>> print "m.lastgroup:", m.lastgroup
m.lastgroup: sign
>>> print "m.group():", m.group()
m.group(): hello world!
>>> print "m.group(1,2):", m.group(1, 2)
m.group(1,2): ('hello', 'world')
>>> print "m.groups():", m.groups()
m.groups(): ('hello', 'world', '!')
>>> print "m.groupdict():", m.groupdict()
m.groupdict(): {'sign': '!'}
>>> print "m.start(2):", m.start(2)
m.start(2): 6
>>> print "m.end(2):", m.end(2)
m.end(2): 11
>>> print "m.span(2):", m.span(2)
m.span(2): (6, 11)
>>> print r"m.expand(r'\g \g\g'):", m.expand(r'\2 \1\3')
m.expand(r'\g \g\g'): world hello!
2.4 re.search(pattern[, flag])
扫描整个string查找匹配的子串,如果成功返回一个matchObject
对象,否则返回None
2.5 re.split(pattern, string[, maxsplit])
按照能够匹配的字串将string分割,并返回列表,maxsplit用于指定最大分割次数。例程如下:
>>> ptn = re.compile(r"\d+")
>>> print ptn.split("one1two2three34four4")
['one', 'two', 'three', 'four', '']
2.6 re.findall(pattern, string[, flag])
搜索string,以列表形式返回全部能够匹配的子串,例程如下:
>>> ptn = re.compile(r"\d+")
>>> print ptn.findall("one1two2three34four4")
['1', '2', '34', '4']
2.7 re.finditer(pattern, string[, flag])
搜索string,返回一个顺序访问每一个匹配结果(MatchObject)的迭代器,例程如下
>>> pattern = re.compile(r'\d+')
>>> for m in re.finditer(pattern,'one1two2three3four4'):
... print m.group()
...
1
2
3
4
2.8 re.sub(pattern, repl, string[, count])
使用repl替换string中每一个匹配的字串后,返回替换后的字符串
1)当repl是一个字符串时,可以使用\id或者\g引用分组,但不能使用编号0,如下:
2)当repl是一个方法时,这个方法只接受一个matchObject对象作为参数,并放回一个字符串用于替换
count用于指定最多替换次数,不指定时全部替换
例程如下:
>>> ptn = re.compile(r"(\w+) (\w+)")
>>> s = "i say, hello world!"
>>> print ptn.sub("replace", s) #使用普通字符串
replace, replace!
>>> print ptn.sub(r"\2 \1", s) #使用\id引用分组
say i, world hello!
>>> def func(m):
... return m.group(1).title() + " " + m.group(2).title()
...
>>> print re.sub(ptn, func, s) #使用方法
I Say, Hello World!
2.9 re.subn(pattern, repl, string[, count])
返回(sub(pattern, repl, string[, count]), 替换次数)