什么是正则表达式?
字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等等。字符串是0个或更多个字符的序列。文本也就是文字,字符串。说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件。
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
元字符
.
匹配除换行符外任意一个字符
[abc]
字符集合,只能表示一个字符位置。匹配所包含的任意一个字符
[^abc]
字符集合,只能表示一个字符位置。匹配除去集合内字符的任意一个字符
[a-z]
字符范围,一个集合,表示一个字符位置匹配所包含的任意一个字符
[^a-z]
字符范围,一个集合,表示一个字符位置匹配除去集合内字符的任意一个字符
\b
匹配单词的边界
\B
不匹配单词的边界
\d
等同[0-9] 匹配一位数字
\D
等同[^0-9] 匹配一位非数字
\s
匹配1位空白字符,包括换行符、制表符、空格等同[\f\r\n\t\v]
\S
匹配1位非空白字符
\w
等同[a-zA-Z0-9_] 包含中文
\W
匹配\w之外的字符
转义
凡是在正则表达式中有特殊意义的符号,转义时使用\
重复
*
前面的正则表达式重复0次或多次
+
前面的正则表达式重复至少一次
?
前面的正则表达式重复0次或1次
{n}
重复n次
{n,}
重复n次以上
{n,m}
重复n到m次
分组(捕获)断言
(pattern)
分组(捕获)后会自动分配组号从1开始可以改变优先级 \数字 匹配对应的分组(指的是前一个匹配上的分组的内容)
(?:pattern)
只改变优先级不分组
(?exp)(?nameexp)
分组捕获 给组命名Python句法为(?Pexp)
(?=exp)
零宽度正预测先行断言断言exp一定在匹配的右边出现
(?<=exp)
零宽度正回顾后发断言断言exp一定出现在匹配的左边出现
(?!exp)
零宽度负预测先行断言断言exp一定不会出现在右侧
(?<!exp)
零宽度负回顾后发断言断言exp一定不会出现在左侧
贪婪与非贪婪
默认贪婪模式,尽可能多的匹配字符串
*?
匹配任意次,尽可能少重复
+?
匹配至少一次,尽可能少重复
??
匹配0或1次,尽可能少重复
{n}?
匹配至少n次,尽可能少重复
{n,m}?
匹配至少n次,至多m次,尽可能少重复
引擎选项
IgnoreCase
匹配时忽略大小写
比如:re.Ire.IGNORECASE
Singleline
单行模式,可穿透/n
比如:re.Sre.DOTALL
Multiline
多行模式
比如:re.Mre.MULTILINE
IgnorePatternWhitespace
忽略表达式中空白字符,若要使用空白字符
比如:re.Xre.VERBOSE
re模块
编译
- re.compile(pattern, flags=0)
- 返回正则表达式对象regex
- 正则表达式编译的结果保存,下次使用同样的pattern时不需要重新编译
单次匹配
- regex.match(string[, pos[, endpos]])
- 从字符串开头匹配,可指定开始与结束位置 返回match对象
- regex.search(string[, pos[, endpos]])
- 从头搜索直到第一个匹配,可指定开始与结束位置 返回match对象
- regex.fullmatch(string[, pos[, endpos]])
- 整个字符串与正则表达式匹配
全文搜索
- regex.findall(string[, pos[, endpos]])
- 对整个字符串从左至右匹配,返回所有匹配项的列表
- regex.finditer(string[, pos[, endpos]])
- 对整个字符串,从左至右匹配,返回所有匹配项的迭代器,每项都是match对象
匹配替换
- regex.sub(replacement, string, count=0)
- 使用pattern对字符串string进行匹配,对匹配项用replacement替换
- replacement可以是string、bytes、function
- regex.subn(replacement, string, count=0)
- 功能类似sub 返回一个元组 (new_string, number_of_subs_made)
分割字符串
- regex.split(string, maxsplit=0)
- 返回列表
分组
- 使用(pattern)捕获的数据放到组中
- match类方法
- group(N)
- 1-N时对应的分组 0但会整个匹配的字符串
- 如果使用了命名分组,可用group(name)方式取出
- groups()
- 返回所有组的一个元组
- groupdict()
- 返回所有命名分组的字典