在线工具(2024.11.19更新)
推荐阅读:Python 正则表达式(本站)
基础匹配模式
实例 | 描述 |
---|---|
. |
匹配除 “\n” 之外的任何单个字符 要匹配包括 ‘\n’ 在内的任何字符,请使用像 ‘[.\n]’ 的模式 |
? |
匹配一个字符零次或一次,另一个作用是非贪婪模式 |
+ |
匹配1次或多次 |
* |
匹配0次或多次 |
\b |
匹配一个长度为0 的子串 |
\d |
匹配一个数字字符 等价于 [0-9] |
\D |
匹配一个非数字字符 等价于 [^0-9] |
\s |
匹配任何空白字符,包括空格、制表符、换页符等等 等价于 [ \f\n\r\t\v] |
\S |
匹配任何非空白字符 等价于 [^ \f\n\r\t\v] |
\w |
匹配包括下划线的任何单词字符 等价于 [A-Za-z0-9_] |
\W |
匹配任何非单词字符 等价于 [^A-Za-z0-9_] |
[Pp]ython |
匹配 “Python” 或 “python” |
[abcdef] |
匹配中括号内的任意一个字母 |
[0-9] |
匹配任何数字 类似于 [0123456789] |
[a-z] |
匹配任何小写字母 |
[A-Z] |
匹配任何大写字母 |
[a-zA-Z0-9] |
匹配任何字母及数字 |
[^au] |
除了au字母以外的所有字符 |
[^0-9] |
匹配除了数字外的字符 |
在Python中,正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
高级匹配模式
1. 分组与非捕获组(2024.11.19更新)
1. 分组(捕获组)
语法:()
介绍:同时匹配多块内容,方便引用,捕获,提取对应的内容
这段正则表达式将文本分成了两组,第一组为:0731
,第二组为8825951
。
2. 非捕获组
语法:(?:...)
介绍:不同于()
的捕获功能,(?:)
用于将一些表达式组合在一起,作为一个整体进行匹配,但不会捕获匹配的内容。
优势:(Generated By Doubao)
- 提高性能:
- 在一些复杂的正则表达式中,如果不需要捕获某些分组内容,使用
(?:)
可以减少正则表达式引擎需要保存的中间结果,从而提高匹配效率。例如,在一个需要匹配大量文本的场景中,存在很多分组,但只有部分分组的内容是后续需要使用的,对于那些不需要使用的分组,使用非捕获分组可以节省内存和时间。
- 在一些复杂的正则表达式中,如果不需要捕获某些分组内容,使用
- 简化反向引用逻辑:
- 有时候我们只是想将一些表达式组合起来进行匹配,而不想让这些分组干扰反向引用。例如,在一个复杂的表达式
(?:abc|def)+\d
中,我们只是想匹配abc
或def
出现一次或多次后跟着一个数字的情况,这里使用(?:)
可以避免创建不必要的捕获分组,使正则表达式的逻辑更清晰,因为如果使用普通的捕获分组,可能会导致意外的反向引用或者混淆真正需要引用的分组。
- 有时候我们只是想将一些表达式组合起来进行匹配,而不想让这些分组干扰反向引用。例如,在一个复杂的表达式
2. 先行断言
很多人也称先行断言和后行断言为环视,也有人叫预搜索,其实叫什么无所谓,重要的是知道如何使用它们!
先行断言和后行断言总共有四种:
- 正向先行断言
- 反向先行断言
- 正向后行断言
- 反向后行断言
2.1 正向先行断言
正向先行断言:(?=表达式)
,指在某个位置向右看,表示所在位置右侧必须能匹配表达式
例如:
我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面有你,这个时候就要这么写:喜欢(?=你)
,这就是正向先行断言。
例:提取包含大小写字母的字符串
先行断言可以用来判断字符串是否符合特定的规则,例如提取包含至少一个大小写字母的字符串:
(?=.*?[a-z])(?=.*?[A-Z]).+
这段正则表达式规定了匹配的字符串中必须包含至少一个大写和小写的字母。
2.1 反向先行断言
反向先行断言(?!表达式)
的作用是保证右边不能出现某字符。
例如: 我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面没有你,这个时候就要这么写:喜欢(?!你)
,这就是反向先行断言。
3.后行断言
3.1 正向后行断言
只需要你记住一句话:先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。
正向后行断言:(?<=表达式)
,指在某个位置向左看,表示所在位置左侧必须能匹配表达式
例如:如果要取出喜欢两个字,要求喜欢的前面有我,后面有你,这个时候就要这么写:(?<=我)喜欢(?=你)
。
3.2 反向后行断言
反向后行断言:(?<!表达式)
,指在某个位置向左看,表示所在位置左侧不能匹配表达式
例如:如果要取出喜欢两个字,要求喜欢的前面没有我,后面没有你,这个时候就要这么写:(?<!我)喜欢(?!你)
。