1. 模式语法
. #匹配任意除"\n"之外的字符
\ #转义字符
[...] #字符集,形式诸如[abc]、[a-c]、[^abc],对应的位置可以是字符集中任意字符
2. 预定义字符集,可写在[…]中
\d #数字[0-9]
\D #非数字[^\d]
\s #空白字符[<空格>\t\r\n\f\v]
\S #非空白字符[^\s]
\w #单词字符[A-Za-z0-9]
\W #非单词字符[^\w]
3. 数量词(写在字符或(…)之后)
* #匹配前一个字符0或无限次(如 abc* 可以匹配ab、abccc)
+ #匹配前一个字符1或无限次
? #匹配前一个字符0或1次
{m} #匹配前一个字符m次(如 ab{2}c 匹配abbc)
{m,n} #匹配前一个字符m~n次
4. 边界匹配(不消耗待匹配字符串中的字符)
^ #匹配字符串开头
$ #匹配字符串末尾
\A #仅匹配字符串开头
\Z #仅匹配字符串末尾
5. 逻辑分组
| #左右表达式任意匹配一个
(...) #分组,作为一个整体,可以后接数量词,如 (abc){2} 匹配 abcabc
(?P<name>...) #为分组指定一个别名,如(?P<id>abc)
6. 引用
(?P=name) #用引用别名为name的分组匹配到的字符串,如 (?P<id>\d)abc(?P=id) 可以匹配 5abc5
\<number> #引用编号为<number>的分组匹配到的字符串,如 (\d)abc\1 可匹配 5abc5
7. 特殊构造
(?:...) # (...)的不分组版本
(?iLmsux) #代表一个匹配模式
(?#...) # #之后的内容作为注释被忽略
(?=...) # =之后的字符串需要匹配,表达式才能成功匹配
(?!...) # !之后的字符串需要不匹配,表达式才能成功匹配
(?<=...) # =之前的字符串需要匹配,表达式才能成功匹配
(?<!...) # !之前的字符串需要不匹配,表达式才能成功匹配
(?(id/name) yes-pattern|no-pattern)
# 如果编号为id或别名为name的分组匹配成功,则需要匹配yes-pattern,否则需要匹配no-pattern,no-pattern可以忽略。
8. 原生字符串
r'abc\t\n'
>>> 输出:abc\t\n
原生字符串可以避免转义字符的困扰。
9. re模块和Pattern对象
Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。
Pattern不能直接实例化,必须使用re.compile()进行构造。
a=re.compile(strPattern[,flag]) #flag是匹配模式
Pattern提供了几个可读属性用于获取表达式的相关信息:
pattern: 编译时用的表达式字符串。
flags: 编译时用的匹配模式。数字形式。
groups: 表达式中分组的数量。
groupindex: 以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。
import re
p = re.compile(r'(\w+) (\w+)(?P<sign>.*)', re.DOTALL)
print "p.pattern:", p.pattern
print "p.flags:", p.flags
print "p.groups:", p.groups
print "p.groupindex:", p.groupindex
### output ###
# p.pattern: (\w+) (\w+)(?P<sign>.*)
# p.flags: 16
# p.groups: 3
# p.groupindex: {'sign': 3}
9.1 match和search
match和search有点类似,都可以匹配模式,但是也有区别。match只能够在字符串的开始位置进行匹配,而search是可以匹配字符串的任意位置,但也是返回找到的第一个匹配的模式,否则返回none。
作为函数
re.match(strPattern,string)
是一次匹配的结果,可以通过match提供的属性或方法来获取信息。
属性:string、re、pos、endpos、lastindex、lastgroup
方法:
m.group([group1,...]) #获得一个或多个分组截获的字符串,group(0)表示整个匹配字符串
m.groups() #以元组形式返回全部分组截获的字符串
m.groupdict() #返回以别名为键,截获的字符串为值的字典
m.start([group]) #返回指定的组截获的子串在string中的起始位置
m.end([group]) #返回指定的组截获的子串在string中的结束位置
m.span([group]) #返回 (start(group),end(group))
m.expand(r'\1\2\3') #将分配到的分组代入到r'...'中然后返回
例子:
m=re.search('cn','www.ddd.cn')
m.group()
>>>'cn'
作为方法
m=a.search('hello world!')
9.2 split
m.split(string[,maxsplit])
或 re.split(pattern,string[,maxsplit])
按照匹配成功的子串将string分割,并返回列表
作为方法
例子:
m=re.compile(r'world')
print m.split('hello world you!')
>>> ['hello ',' you!']
9.3 findall
findall(string[,pos[,endpos]])
搜索string,以列表的形式返回所有能匹配的子串
9.4 finditer
finditer(string[,pos[,endpos]])
返回一个顺序访问每个结果(match对象)的迭代器
9.5 sub
sub(repl,string[,count])
使用repl替换string中每个匹配的子串后返回替换后的字符串
例子:
p=re.compile(r'(\w+)(\w+)')
s='I say,hello world!'
t=p.sub(r'\2 \1',s)
>>>t='say I,world hello!'
9.6 subn
subn(repl,string[,count])
返回 (sub(repl,string[,count]),替换次数)