匹配规则:
. 任何单个字符
[] 单个字符的取值范围[^ ] 不取括号内的字符
* 前一个字符的0至任意次
+ 前一个字符的1次至任意次
? 前一字符的0或1次
| 左右表达式任意一个,相当于或运算
{m} 前一个字符M次 ab{2}c=abbc
{m,n} 前一字符m至n次
^ 字符串开头
$ 字符串结尾
() 分组标记,内部只能用|,(abc)=abc,(abc|aaa)=abc或aaa
\d 数字,=[0-9], \d{m}=m个数字
\w 单字符,=[A-Za-z0-9]
import re
原始字符串屏蔽反斜杠转义效果
r'\b'='\\b' 匹配一个单词边界,
'\b' 退格
Re主要函数:
match = re.search(pattern, string, flags=0) 匹配整个字符串,返回第一个符合的位置
pattern:正则表达式
string:待匹配字符串
flags:控制标记
.match(pattern, string, flags=0) 从字符串开头开始匹配正则,开头若不匹配则返回错误
.findall(pattern, string, flags=0) 返回所有匹配到的列表
.split(pattern, string, maxsplit=0, flags=0) 将匹配到的作为分隔符分割字符串
maxsplit最大分割数
.finditer(pattern, string, flags=0) 放回一个匹配结果的迭代类型
.sub(pattern, repl, string, count=0, flags=0)
repl: 替换匹配后的字符串
count: 匹配的最大替换数量
a = re.search(r'pattern','string') 一次性匹配
b = re.compile(r'pattern') 面向对象方法:提前编译匹配内容后使用
a = b.search('string') 用b替代re,已经包含编译的规则,当使用量大时可以减小开支,加快运行速度
编译后可以使用re的全部函数
re匹配后返回match对象
match对象属性:
.string 待匹配文本
.re 正则
.pos 文本匹配开始的位置
.endpos 文本匹配的结束位置
match对象的方法:
.group(0) 获得匹配后的字符串
.start() 匹配到的字符串在原字符串中的开始位置
.end() 匹配到的字符串在原字符串中的结束位置
.span() 返回(.start(), .end())
贪婪匹配:
re默认采用这种匹配方式,即返回在复合匹配要求的最长字符串
r'a.*b' 'abcdbefbghdij' 将返回abcdbefb
在匹配规则中使用?改为最小匹配,r'a.*?b'返回ab, r'a.+?b'返回'abcdb'