目录
测试环境:
操作系统: Window 10
工具:Pycharm
Python: 3.7
理解 re 模块的语法逻辑
re
模块的语法的方法调用逻辑大致概要:
- 先选定一个匹配模式作为第一个参数,参数类型为字符串形式;
- 第二个参数是要进行匹配操作的字符串参数,参数类型为字符串形式;
- 第三个是对前面匹配的一个匹配补充操作(正则表达式修饰符 - 可选标志),但是这个补充操作却会和之前第一个参数指定的匹配模式,产生一个影响,或者说可能会有一个冲突,当然这一点需要注意,该参数属于正则表达式
re
模块的 全局变量,格式需要好好记牢。
补充说明 1:捕获 ( )与不捕获(? )
正则表达式一般匹配到了,就会进行一个文本的存储,如果设置了一个不捕获的模式,那么就不会存储匹配到的结果值,而是一个字符串比较的逻辑操作,一般而言使用 或 ( | )运算,来实现多个字符串比较。
( )
圆括号分组,就是捕获,就一定会存储匹配到的文本,作为匹配成功值的其中之一,直到给予的数据匹配结束为止。
捕获(获取匹配) | 不捕获(非获取匹配) |
---|---|
( ) 分组捕获 | (?: ) |
(?> ) 固化分组捕获 | 前向匹配的字符位置 test(?= ) 前向肯定界定符 |
(?! ) 前向否定界定符 | |
反向肯定界定符 (?<= ) test 反向匹配的字符位置 | |
(?<! ) |
补充说明 2:正则表达式的控制权转移
如下面的匹配模式例子所示:
# 匹配模式
`'(\d\d[1-9)]?)\d+'`
第一个
\d
匹配完成后,将控制权给了下一个\d
,匹配完成后,又将控制权给了[1-9]?
,然后括号内匹配完成后,再控制权从圆括号内( )
转移到了外面\d+
补充说明 3:备用状态(回溯)与交还匹配内容
如何理解回溯点有多少个分支尝试,是看 ? + * 所代表的匹配含义的。
?
第一层含义代表了匹配1
个字符,第二层含义代表了交还匹配到的内容,相当于回溯,也就是回退到上一个字符位置,代表了匹配0
个字符;0 ≤ n ≤ 1, n是整数,也是字符匹配个数
+
至少要有一个字符匹配到,在使用特定的[ ]
时,存在一个连续的特性,比如\d+
可以匹配 123456789123456789… 一直到后面,只要是数字类型的,就可以无限匹配,直到出现非数字字符停止匹配,但是如果连一个数字字符都匹配不到,那么就会匹配失败,仅仅捕获( )
分组内匹配到的内容,满足+
至少要有一个字符存在的要求,且+
不存在交还匹配到的内容,它必须要有一个字符,不能交还匹配到的内容;n ≥ 1, n是整数,也是字符匹配个数
*
包含了 ? 和 + 的一些规则,但不是全部的规则,包含了 ? 的交还匹配到的内容,匹配到 0 个字符,也包含了 + 的匹配字符数量大于 1 的规则。n ≥ 0, n是整数,也是字符匹配个数
eg:
匹配三位数字,且第三个数不为
0
。
例子:456
匹配模式: '(\d\d[1-9)]?)\d+'
解析理解:
① 第一个 \d 用来匹配 4 ,第二个 \d 用来匹配 5 ,[1-9] 则用来匹配 6 ,? 匹配一个数字 6 与 0 个字符
② \d\d[1-9] 匹配字符串为 456 备用状态(回溯标记)是 45 匹配模式 \d+
③ 尝试匹配数字 6 ,匹配结果 456\d+ ,其中 \d+ 匹配不到至少一个数字,导致匹配失败,进行回溯,返回备用状态(回溯标记点) —— 45
④ 45 后匹配 0 个字符,匹配模式为 45\d+ ,结果为 456 ,其中 6 给了 \d+ 匹配
| ———>[1-9] 匹配 数字6 ——————> \d+ 没有字符可以,导致匹配失败
回溯点 |
45 [1-9]?|
| ———> 0个字符,交换匹配的内容数字6 ——————> \d+ 匹配数字6
参考链接:
https://www.bbsmax.com/A/Vx5MjG7mdN/
https://blog.csdn.net/liaowenxiong/article/details/118459839
记忆第一个参数 —— 匹配模式字符串类型的语法格式
初级模式
初级模式 | 描述 |
---|---|
^ | 匹配字符串的开头 (特别注意区分方括号内的 非运算 [^ ] 的作用) |
$ | 匹配字符串的末尾 |
. | 匹配任意字符,除了换行符,当re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符。 |
[ ] | 方括号用来表示一组字符匹配,举例:[amk] 匹配 ‘a’,‘m’,‘k’,这三个字符都要进行匹配,存在其中之一,则进行下一个字符匹配。 |
[^ ] | 不存在方括号[ ] 中的任意字符,举例:[^abc] 匹配除了a,b,c之外的字符。 |
+ | 量词,匹配1 个或 多个 的表达式。(匹配到开头至少要有一个字符存在,否则0 个字符则回溯) |
* | 量词,星号匹配 0 个或 多个 前面的表达式。(前面有 0 个或 大于 1 数量的字符存在) |
? | 量词,匹配0 个或1 个前面的正则表达式定义的片段。(前面有 0 或 1 个字符存在) |
? (0≤n≤1)
、+ (n≥1)
是* (n≥0)
的子集。n
为? + *
量词前面字符串的出现次数
正则表达式修饰符 - 可选标志
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|
) 它们来指定。如 re.I
| re.M
被设置成 I
和 M
标志:
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 ( insensitive adj.不敏感的,反应迟钝的) |
re.L | 做本地化识别(locale-aware )匹配 |
re.M | 多行匹配,影响 ^ 和 $ ( Multi-line n. 多行) |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode 字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。( flexible adj. 灵活的) |
中级模式
中级模式 | 描述 |
---|---|
{ n } | 花括号{ } 内精确匹配 n 个前面表达式。例如, o{2} 不能匹配 “Bob” 中的 “o”,但是能匹配 “food” 中的两个 o。 |
{n, } | 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。“o{1,}” 等价于 “o+ ”。“o{0,}” 则等价于 “o* ”。 |
{n,m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a | b | 匹配 a 或 b 分支尝试 |
( ) | 对正则表达式分组并记住匹配的文本,会存储匹配到文本,以供后面使用,类似 SQL语句的 Group by |
(?: ) | 类似 ( ) 正则表达式分组, 但是不表示一个组,不捕获文本,不会存储匹配到文本,与( ) 相反,常与管道符 **` |
(?imx ) | 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。可选标志指的是正则表达式修饰符 re.I (i)、re.M (m)、re.X (x) |
(?-imx ) | 正则表达式 - 指关闭 i, m, 或 x 可选标志。只影响括号中的区域。可选标志指的是正则表达式修饰符 re.I (i)、re.M (m)、re.X (x) |
(?imx: ) | 在(?: ) 括号中可使用 i, m, 或 x 可选标志 |
(?-imx:) | 在(?: ) 括号中不使用 / 关闭 i, m, 或 x 可选标志 |
(?# ) | 注释. |
(?= ) | 前向肯定界定符。非获取匹配,正向肯定预查,以匹配前面的字符串为基准,以后面正则表达式的匹配模式为基准匹配,该匹配不需要获取供以后使用,类似 (?: ) 不会存储匹配文本。 |
(?! ) | 前向否定界定符。与肯定界定符相反 ,非获取匹配,正向否定预查,以匹配前面的字符串为基准,以后面正则表达式的匹配模式为基准匹配,该匹配不需要获取供以后使用,类似 (?: ) 不会存储匹配文本。 |
(?<= ) | 非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。以匹配后面的字符串为基准,以前面正则表达式的匹配模式为基准匹配,该匹配不需要获取供以后使用,类似 (?: ) 不会存储匹配文本。 |
(?<! ) | 非获取匹配,反向否定预查,与正向否定预查类似 |
(?> ) | 注意是固化分组,而不是前向的作用,匹配的独立模式,省去回溯。 |
\w | 匹配字母数字及下划线 |
\W | 匹配非字母数字及下划线 |
\s | 匹配任意空白字符,等价于 [ \t\n\r\f]。 |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9]. |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
\B | 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
\n,\t,\r,\f. | \n 匹配一个换行符。\t 匹配一个制表符。\r 匹配一个回车符。\f 匹配一个换页符等 |
\1…\9 | 匹配第n个分组的内容。 |
\10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |
.* 贪婪匹配,匹配会有最短和最长字符串等 n 种匹配情况发生,那么贪婪匹配,只选择一种情况,那就是最长的字符串的情况,其他的都被忽略了,返回的匹配到的字符串结果元素就只有一个而已,n ≤ 1
懒惰模式 / 非贪婪方式 (.*?
和贪婪匹配是相反的,只选择最短的情况 —— 最短的字符串)
.+
贪婪匹配
.+?
非贪婪匹配
参考链接:
Python 正则表达式