re包规定的元字符:
. ^ $ * + ? \ | { } [ ] ( )
- 贪婪匹配:与有可能匹配的最长子串匹配
在这里 ab* 匹配 abbbbbb,* 运算符做贪婪匹配
- 非贪婪匹配:与有可能匹配的最短子串匹配
字符组表达式
- 字符组表达式
[abc]可以匹配字符a或b或c
区间形式[0-9]是顺序列出的缩写,匹配数字字符0到9
[0-9a-zA-Z]匹配所有英文大小写和数学字符- [^…]中的^表示求补
[0-9]匹配所有非十进制数字的字符
[^ \t\v\n\f\r]匹配所有非空字符(非空格/制表符/换行符)
注:使用^时,^必须再首位- 原点字符
a.b匹配所有以a开头b结尾的三字字符串
为了方便,re换意串定义了几个常用字符,如下:
\t :与十进制数字的所有字符匹配,等价于[0-9]
\D :与非十进制数字的所有字符匹配,等价于[^0-9]
\s :与所有空白字符匹配,等价于 [ \t\v\n\f\r]
\S :与所有非空白字符匹配,等价于 [^ \t\v\n\f\r]
\w :与所有字母数字字符匹配,等价于 [0-9a-zA-Z]
\W :与所有非字母数字字符匹配,等价于 [^0-9a-zA-Z]
重复
运算符是,α与α吃的0次或任意多次出现匹配
- 重复运算符+表示1次或多次重复
例:‘\d+’等价于‘\d\d*’ - 可选片段用?运算符表示
?表示0次或1次重复 - 确定重复次数的用{n}表示
a{n}与a匹配的串的n次重复匹配
a{m,n}与a匹配的串的m到n次匹配
- 重复运算符+表示1次或多次重复
- + ? {m,n}都采用贪婪匹配
*? +? ?? {m,n}?都采用非贪婪匹配(在各运算符后面加问号)
选择运算符
|描述两种或多种情况之一的匹配
a|b可以匹配a或b,等价于[ab]首尾匹配
- 行首匹配:以^符号开头的模式,只能与一行的前缀子串匹配
- 行尾匹配:以$符号结尾的模式,只与一行的后缀匹配
- 串首匹配:\A 开头的模式只与被匹配串的前缀匹配
- „串尾匹配:\Z 结束的模式只与被匹配串的后缀匹配
单词边界
- \b描述单词边界,它表示示单词边界匹配一个空串。单词是字母数字的连续序列,边界就是非字母数字字符或无字符(串开头/结束)
- \B是\b的补,也是匹配空字符串,但要求相应的位置是数字或字母
>>>re.findall('py.\B', 'python, py2')
['pyt','py2']
- 模式里面的组
- ‰圆括号括起的模式段 (…) 也是模式,它与被括子模式匹配的串匹配。但在此同时还确定了一个被匹的“组”(字符段)
- 被匹配的组可用\n形式在模式里面“引用”要求匹配同样字符段。这里的 n 表示一个整数序号,组从 1 开始编号
r'(.{2}) \1'可匹配'ok ok'或'no no',不能匹配'no ho'
- 其他匹配操作
re.fullmatch( pattern, string, flags=0)
# 如果整个 string 与 pattern 匹配则成功并返回相应的 match 对象,
否则返回 None
re.finditer( pattern, string, flags=0)
# 功能与 findall 类似,但返回的不是表而是一个迭代器,使用该迭代器可顺序取得表示各非重叠匹配的 match 对象
re.sub( pattern, repl, string, count=0, flags=0)
# 做替换,把 string 里顺序与 pattern 匹配的各非重叠子串用repl代换。repl是串则直接代换;另一情况,repl 还可以是以match 对象为参数的函数,这时用函数的返回值代换被匹配子串
- 匹配对象(match对象)
- 取得被匹配的子串:mat.group()
在一次成功匹配中,所用的正则表达式匹配了目标串的一个子串,操作 mat.group() 给出这个子串 - 在目标串里的匹配位置:mat.start()
得到 mat 代表的成功匹配在目标串里的实际匹配位置,这是目标串的一个字符位置(下标) - 目标串里被匹配子串的结束位置:mat.end()
这个位置采用常规表示方式。设 text 是目标串,有如下关系:mat.group() == text[mat.start():mat.end()] - 目标串里被匹配的区间:mat.span()得到匹配的开始和结束位置形成的二元组mat.span() == mat.start(), mat.end()
- mat.re 和 mat.string 分别取得得到这个 match 对象所做匹配的正则表达式对象和目标串
- 取得被匹配的子串:mat.group()
- 正则表达式
- 检索:regex.rearch(string[,pos[,endpos]])
在给定的串 string 里检索,可以指定开始和结束位置。按 Python惯例,两个位置确定一个左闭右开的区间。默认从头到尾对 string 检索,只给了 pos 就从那里检索到最后。 - 匹配:regex.match(string[,pos[,endpos]])
检查给定的串string是否有与regex匹配的前缀。pos指定开始匹配前缀的位置,endpos给定被匹配段的终点。 - 完全匹配:regex.fullmatch(string[, pos[, endpos]])
检查 string 中所指定范围构成的那个子串是否与 regex 匹配,默认范围是整个串。 - 下面两个方法与 re. 同名操作功能类似,但都可以指明匹配区间:
regex.findall(string[, pos[, endpos]])
regex.finditer(string[, pos[, endpos]]) - 下面两个操作与 re. 同名操作功能相同
切分:regex.split(string, maxsplit=0)
替换:regex.sub(repl, string, count=0)
- 检索:regex.rearch(string[,pos[,endpos]])
- regex.pattern 取得生成 regex 所用的模式字符串