Regular Expression Operations
正则表达式
一.原子
原子是正则表达式中最基本的组成单位,每个正则表达式至少要包含一个原子
常见原子主要分为以下4类:
- 普通字符
- 非打印字符
- 通用字符
- 原子表
1.普通字符作为原子
使用一些普通字符,如:字母、数字、下划线
符号 | 含义 |
---|---|
0-9 | 数字 |
a-z | 小写字母 |
A-Z | 大写字母 |
_ | 下划线 |
2.非打印字符作为原子
在字符串中用于格式控制的符号
符号 | 含义 |
---|---|
\n | 换行符 |
\t | 制表符 |
3.通用字符作为原子
通用字符,即一个原子可以匹配一类字符
符号 | 说明 |
---|---|
\w | 匹配 字母、数字、下划线、汉字 |
\W | 匹配 非 字母、数字、下划线、汉字 |
\s | 匹配 任意空白符(空格,制表符Tab,换行符,中文全角空格等) |
\S | 匹配任意 非 空白符(空格,制表符Tab,换行符,中文全角空格等) |
\d | 匹配 数字 |
\D | 匹配 非 数字 |
注意:小写字母为本义,大写字母为反义
4.原子表
一个原子表内可自行添加多个用于匹配的字符
符号 | 含义 |
---|---|
[ ] | 匹配 括号内任一字符 |
二.原子符
1.任意匹配原子符
符号 | 含义 |
---|---|
. | 匹配 除换行符以外的任意字符 |
2.边界限制原子符
符号 | 含义 |
---|---|
^ | 匹配 字符串的开头 |
$ | 匹配 字符串的结尾 |
3.限定符(重复匹配)
符号 | 说明 |
---|---|
? | 重复 0或1个字符 |
* | 重复 0或多个字符 |
+ | 重复 1或多个字符 |
{n} | 重复 n次字符 |
{n,} | 至少重复 n次字符 (匹配 大于n次字符) |
{n,m} | 重复 n到m次字符 |
4.模式选择符(分支条件)
匹可以设置多个模式,匹配时可以从中选择任意一个模式进行匹配
符号 | 含义 |
---|---|
A|B | 选择模式A或者B进行 匹配 |
注意:分支匹配时会从左到右,所以顺序很重要
5.分组
用小括号来指定子表达式
,来进行分组,然后可以对子表达式进行原子符操作
符号 | 含义 |
---|---|
() | 指定子表达式 |
注意:每一个()都会当做一个结果来显示,无结果会返回空。
分组函数 .group(n) 与 .groups()
可分别显示match、search等返回匹配对象
的函数的结果
.group(0) 与 .group() 显示所有匹配结果
.group(k) k>0, 显示第k个结果
.groups() 以元祖的形式显示所有结果
部分函数可直接返回结果,无需主动调用分组函数
三.模式修正
在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能
常用的模式修正符:
符号 | 全写 | 含义 |
---|---|---|
re.I | IGNORECASE | 匹配时,忽略大小写 |
re.M | MULTILINE | 多行匹配,影响 ^ 和 $ |
re.L | LOCAL | 使预定字符类 \w \W \b \B \s \S ,做本地化识别(locale-aware)匹配 |
re.U | UNICODE | 根据Unicode字集解析字符,影响预定字符类 \w \W \b \B \s \S \d \D |
re.S | DOTALL | 让.匹配包括换行符,即匹配任意字符 |
re.X | VERBOSE | 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释 。该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解 |
可运用于:后面函数中的flags标志位参数
四.反义
反义即原义取反,前面原子的通用字符类型有部分涉及
符号 | 含义 |
---|---|
\D | 匹配任意非 数字 |
\W | 匹配任意非 字母数字下划线 |
\S | 匹配任意非 空白字符 |
\B | 匹配非 单词边界 |
\b | 匹配单词边界 |
[^ ] | 匹配除 原子表以外的任意字符 |
五.贪婪模式与懒惰模式
通常情况下,我们需要使字符串能匹配尽可能多的字符,举例:则 p.*q 会匹配最长的,从第一个p开头、到最后一个q结尾的字符串。
但有时候,我们需要懒惰匹配,即尽可能匹配少的字符,举例:则 p.*?q 会匹配,从第一个p开头到第一个q结尾的字符串。
懒惰限定符与贪婪限定符:
符号 | 模式 | 含义 |
---|---|---|
.* | 贪婪模式 | 尽可能地多匹配 |
.*? | 懒惰模式 | 尽可能的少匹配 |
*? | 懒惰模式 | 重复任意次,但尽可能减少重复 |
+? | 懒惰模式 | 重复1次或更多,但尽可能减少重复 |
?? | 懒惰模式 | 重复0次或1次,但尽可能减少重复 |
{n,m} | 懒惰模式 | 重复n次到m次,但尽可能减少重复 |
{n,} | 懒惰模式 | 重复n次以上,但尽可能减少重复 |
思考:为什么ppqqq懒惰匹配p.*?q时,不是从第二个p开始,从而截取最短的字符串pq,而是ppq?
注意:正则表达式里有另一条规则,比懒惰/贪婪的优先级更高:最先开始的匹配拥有最高的优先权--The match that begins earliest wins
六.正则表达式常见函数
1. re.match()函数
含义:
从起始位置进行匹配,即从第一个字符开始完全匹配才成功,结果返回一个对象
格式:
re.match(pattern, string, flags)
参数:
pattern - 正则表达式
string - 要匹配的文本字符
flags - 可选参数,可选择模式修正等信息,可以使用按位或'|'表示同时生效。支持 re.L|re.M 同时匹配
2. re.search()函数
含义:
从整体进行匹配,即从任意位置开始完全匹配成功就返回对象,但只会匹配出返回的第一个对象
比match高级一点
格式:
re.search(pattern, string, flags)
参数:
pattern - 正则表达式
string - 要匹配的文本字符
flags - 可选参数,可选择模式修正等信息,可以使用按位或'|'表示同时生效。
3. re.findall()与re.finditer()全局匹配函数
含义:
- 将符合模式的内容全匹配出来,匹配返回所有匹配结果,以列表的形式呈现
- 将符合模式的内容全匹配出来,匹配返回所有匹配结果,以可迭代对象的形式呈现
比search更高级一点
格式:
re.findall(pattern, string, flags)
re.finditer(pattern, string, flags)
参数:
pattern - 正则表达式
string - 要匹配的文本字符串
flags - 可选参数,可选择模式修正等信息,可以使用按位或'|'表示同时生效。
4. re.sub()函数
含义:
根据正则表达式,将匹配到的字符串进行替换
格式:
re.sub(pattern, rep, string, max)
参数:
pattern - 正则表达式
rep - 要替换成的字符串
string - 源字符串
max - 可选项,最多替换次数,默认将符合模式的结果全部替换
5. re.split()函数
含义:
以匹配到的字符串为分割线,对原字符串进行分割
格式:
re.split(pattern, string, maxsplit, flags)
参数:
pattern - 正则表达式
string - 要进行切割的字符串
maxsplit - 最大分割次数,不指定将全部分割
6. re.compile()函数
含义:
编译正则表达式,返回一个模式对象。可以把常用的正则表达式,编译成正则表达式对象,方便以后调用以提高效率
格式:
re.compile(pattern, flags)
参数:
pattern - 指定正则表达式
flags - 可选参数,可选择模式修正等信息,可以使用按位或'|'表示同时生效。
使用:
regex = re.compile(pattern, flags)
regex.search(string)
注意:
该函数的使用:
请不要再使用compile了
参考文档
正则表达式30分钟入门教程
python编程基础—正则表达式
修订时间
- 第一次修订 2019/12/14