Regular Expression概述
对字符串定规矩
描述某种规则的表达式
英语:Regular Expression,在代码中常简写为regex、regexp或RE
Regular Expression的“Regular”一般被译为“正则”、“正规”、“常规”。此处的“Regular”即是“规则”,"规律"的意思
Regular Expression即“描述某种规则的表达式”之意。
作用: 通过regex ,可以在一个字符串中找到特定所需的子串
以字符匹配字符
匹配的过程: 不断消耗的过程, (正则表达式中的字符)一个字符只能匹配一次!
匹配成功: 配成 正则表达式里的 所有规则(每一个字符的规则都得满足)
re模块
python中 使用Regular Expression的模块 --> re即regex的缩写
match(pattern, string, flags=0): 进行正则匹配检查方法
若匹配, 返回 匹配对象( Match Object)
否则返回None (注意 不是空字符串"",因为空字符串可能也是某种规则)
函数 | 作用 |
---|---|
compile | 把正则表达式的模式和标识转化成正则表达式对象, |
match | 在字符串的开始位置尝试匹配正则表达式 match(pattern, string, flags=0),从头开始匹配,且regex中每一个规则都匹配完了,不管后面有没有字符立即停止匹配,返回匹配合规的那部分子串, (默认判断以什么开口, 却不判断以什么结尾) |
search | 在字符串中查找匹配正则表达式模式的位置,返回 Match Object 的实例,如果没有找到匹配的位置,则返回 None。 |
split | 将字符串匹配正则表达式的部分割开并返回一个列表 |
findall | 在字符串中找到正则表达式所匹配的所有子串,并组成一个列表返回。 |
finditer | 在字符串中找到正则表达式所匹配的所有子串,并组成一个迭代器返回。 |
sub | 在字符串 string 中找到匹配正则表达式 pattern 的所有子串,用另一个字符串 repl 进行替换。 sub(pattern,repl, string[, count=0]) 替换 所有 |
subn | 该函数的功能和 sub() 相同,但它还返回新的字符串以及替换的次数。 |
falgs
- re.S
转义
在正则表达式里存在两层转义
字符串转义 : 字符串本身存在转义, 目的是为了表达一些特殊的功能(拿出了一些字符来表示别的含义): \n, \t
但是总得找个方式表达这个字符本身(比如 \),就是字符本身,没别的意思
- 方法就是 加一个 \
简单方法 : 加 r –>raw
正则表达式转义: 也有转义, 也是为了表达一些特殊的功能(拿出了一些字符来表示别的含义): . , \t, *,
但是总得找个方式表达这个字符本身(比如 \), 就是字符本身,没别的意思
- 方法就是 加一个 \
简单方法 : 加 r –>raw
转义顺序: 先字符串, 再正则表达式
转义符
\f 表示换页 form feed
\t 表示水平制表符 horizontal table
\v 表示垂直制表符 vertical table
lc
lc
lc
lc
lc
lc
\n newline / next 移动到下一行的开头
\r return
\a aeolian bells
\num 表示指定分组 ,引用分组num匹配到的字符串
re.match(r"<()>")
单个字符
[ ] 匹配[ ]中列举的字符
. [^\n\r] 任意字符(除了换行\n和回车\r之外)
\d [0-9] 数字,数字字符 Digit
\D [^0-9] 非数字,字符
\w [a-zA-Z0-9_] 字母,数字,下划线 (标识符) Word
\W [^a-zA-Z0-9_] 非单词字符(非标识符)
\s [\f\r\n\t\v] 匹配空白,即 空格,tab键(不可见字符) Space
\S [^\f\r\n\t\v] 非空白(可见字符)
字符 | 功能 |
---|---|
. | 匹配任意1个字符(除了\n) |
[ ] | 匹配[ ]中列举的字符 |
\d | 匹配数字,即0-9 —> digital |
\D | 匹配非数字,即不是数字 |
\s | 匹配空白,即 空格,tab键 —> space |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z、A-Z、0-9、_、unicode字符(中文/日文都行) –> word |
\W | 匹配非单词字符 |
记忆线:
范围从小到大:
space --> digital --> word --> [] --> .
空格 --> ( 数字 --> 单词 ) --> ( 指定--> 所有 )
大写取反
表示数量(连续出现)
字符 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次,即可有可无 |
+ | 匹配前一个字符出现1次或者无限次,即至少有1次 |
? | 匹配前一个字符出现1次或者0次,即要么有1次,要么没有; |
{m} | 匹配前一个字符出现m次 |
{m,} | 匹配前一个字符至少出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
“*” | 重复零次或更多 x>=0 |
---|---|
“+” | 重复一次或更多次 x>=1 |
“?” | 重复零次或一次 x=(0||1) |
{n} | n次 x=n |
{n,} | 重复n次或更多 x>=n |
{n,m} | 重复出现的次数比n多但比m少 n<=x<=m |
记忆线: 连续出现次数
? --> + --> *
要么有,要么没有 --> 最起码一次 --> 任意次
{m,n} m到n次
表示边界
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配 非单词 边界 |
匹配分组 group
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号中字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P\) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
记忆线:
( a | b ) : 组内左或右
套路
套路 | 思想 |
---|---|
r”<[^>]*>” | 取到你想匹配的字符之前, 再加上这个字符, 就取到了全部 |
贪婪和非贪婪
前提: 是在 满足整个 正则表达式的 前提下!
贪婪: 在满足后面的规则前提下, 尽量多取
非贪狼: 尽量少取
1.不贪婪: 后面没有规则,
能少取就少取
2.弱贪婪:后面有规则,
在满足后面的规则的贪婪前提下, 再尽量多取(弱贪婪)
针对对象: 数量 通配符 * / + / ? / {m,n}
贪婪转非贪婪:
数量 通配符 + ?
极端最不贪婪:
?* --> 没有
+* --> 一个
** --> 没有
{m,n}? --> m个
- 贪婪:
在满足后面规则的前提下 , 前面的规则尽量多取 - 非贪婪:
在满足后面规则的前提下, 前面的规则尽量少取
>>> re.match(r"aa(\d+)","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)","aa2343ddd").group(1)
'2'
>>> re.match(r"aa(\d+)ddd","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)ddd","aa2343ddd").group(1)
'2343'
>>>