元字符:
. 除换行符的任意字符
转义字符
[...] 字符集合
d 数字:[0-9]
D 非数字[0-9]
s 空白字符 [<空格>
f]
S 非空白字符[^s]
w 单词字符[A-Za-z0-9_]
W 非单词字符[^w]
数量词:
* 匹配一个字符0或多次
+ 匹配前一个字符1次或多次
? 匹配前一个字符0次或1次
{m} 匹配前一个字符m次
{0,}等同于* {1,}等同于+ {0,1}等同于?
{m,n} 匹配前一个字符m至n次
边界符:
^ 匹配字符串开头,多行匹配每一行开头
$ 匹配字符串末尾,多行匹配每一行末尾
A 仅匹配字符串开头
仅匹配字符串末尾
匹配w和W之间
(^ 放在字符集合外:表示匹配字符串开头
放在字符集合里:表示非)
逻辑、分组:
| 左右表达式任意匹配一个
先匹配左边一旦成功则跳过匹配右边
如果|没有包含在()中,匹配整个正则表达式
(...) 分组匹配,从左到右,每遇到一个编号+1,分组后可加数量词
(?P<name>...) 除了分组序号外,指定一个name的别名
<number> 引用编号为<number>的分组匹配到的字符串
(?P=name) 引用别名为<name>的分组匹配到的串
方法、函数:
match() 决定RE是否在字符串刚开始的位置匹配
search() 扫描字符串,找到这个RE匹配的位置
findall() 找到RE匹配的所有子串,并把它们作为一个列表返回
finditer() 找到RE匹配的所有子串,并把它们作为一个迭代器返回
如果没有匹配到,match()和search()将返回None,否则返回MatchObject实例
MatchObject实例方法:
group() 返回被RE匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配(开始,结束)的位置
p = re.compile(...)
m = p.match('stirng goes here')
if m:
print 'Match found:',m.group()
else:
print 'No match'
模块级函数:
match()
search()
sub() re.sub(正则表达式string,要替换的string,原始字符串)
subn() 和sub用法一样,会同时返回替换的次数
split() re.split(正则表达式,原始字符串string)
findall()
re属性(编译标志flag):
DOTALL,S 使.匹配包括换行在内的所有字符
IGNORECASE,I 使匹配对大小写不敏感
LOCAL,L 使本地化识别(locale-aware)匹配(法语等)
MULTILINE,M 多行匹配,影响^和$
VERBOSE,X 能够使用REs的verbose状态,使之被组织得更清晰易懂
分组:
(...)
(...|...)
当有分组时,findall返回的结果会优先返回分组(括号中)中的数据