正则表达式必知必会
基本语法
速查表
| single char | quantifiers(数量) | position(位置) | 需要注意的转义符号 |
|---|---|---|---|
| \d 匹配数字 | * 0个或者更多 | ^一行的开头 | \\ |
| \w 匹配word(数字、字母) | + 1个或更多,至少1个 | $一行的结尾 | \( |
| \s 匹配white space(包括空格、tab等) | ? 0个或1个,一个Optional | \b 单词"结界"(word bounds) | |
| \S 匹配非white space(包括空格、tab等) | {min,max}出现次数在一个范围内 | ||
| . 匹配任何,任何的字符 | {n}匹配出现n次的 |
进阶内容
分类符
-
[]的作用,用英文表达就是"alternation",表达一个或的逻辑; -
/[-.(]/在符号中的连字符-放在第一位表示连字符本身,如果放在中间,表示"从..到..",比如[a-z]表示a-z -
[.)]括号中的特殊符号不需要转义,就表示其本身 -
[^ab]
括号中的^表示非,anythings exceptaandb -
(a|b)也可表示选择,但是它有更强大的功能....
分组捕获
- 分组捕获,使用()进行数据分组,编号0代表整个匹配项,选择的分组从1号开始
- 选择器可以使用
$1和\1,但是使用场景不同,\用在正则表达式自己身上
贪婪匹配
如何匹配HTML标签
-
<.+?> ?
符号可以禁止贪婪属性,放在.*`之后,表示一次匹配遇到重点就可以停止。否则将会一直向后匹配。 -
<[^<>]+> 匹配除了<和>的字符
前向匹配
- d(?=r) 只有d紧跟r才会匹配,但是r不是匹配串的一部分
- (?<=r)d 只有d前面是r才会匹配,但是r不是匹配串的一部分
- (?r)**d 只有d前面不是r才会匹配,但是r不是匹配串的一部分
在Python中的应用
反斜杠困境
在字符串之前加一个r可以保证匹配原始符号
| Regular String | Raw string |
|---|---|
"ab*" |
r"ab*" |
"\\\\section" |
r"\\section" |
"\\w+\\s+\\1" |
r"\w+\s+\1" |
分步匹配
编译Pattern objects
import re
p = re.compile('ab*',re.X) # 创建Pattern objects
Pattern objects编译标记
| Flag | Meaning |
|---|---|
IGNORECASE, I |
忽略大小写 |
MULTILINE, M |
多行匹配,会影响^ 和 $ |
Pattern objects常用方法
| Method/Attribute | Purpose |
|---|---|
match() |
返回匹配对象(Match Object) |
search() |
返回匹配的位置 |
findall() |
以列表形式返回所有匹配的子串 |
finditer() |
以迭代器形式返回所有匹配的子串 |
sub('替换串','待替换串',count=1) |
找到所有的字符串并替换 |
subn() |
和sub效果一样,但会多返回一个替换位置 |
Match object常用方法
- 调用相关方法前,先确定Match Object是否匹配
| Method/Attribute | Purpose |
|---|---|
| group() | 返回匹配的字符串 |
| start() | 返回匹配的起始位置 |
| end() | 返回匹配的结束位置 |
| span() | 返回匹配的起止位置 |
直接匹配
- 不在循环中进行正则匹配时可以考虑直接匹配
re.match(r'From\s+', 'From amk Thu May 14 19:12:10 1998')
<re.Match object; span=(0, 5), match='From '>
参考
Regex tutorial — A quick cheatsheet by examples
基本语法
速查表
| single char | quantifiers(数量) | position(位置) | 需要注意的转义符号 |
|---|---|---|---|
| \d 匹配数字 | * 0个或者更多 | ^一行的开头 | \\ |
| \w 匹配word(数字、字母) | + 1个或更多,至少1个 | $一行的结尾 | \( |
| \s 匹配white space(包括空格、tab等) | ? 0个或1个,一个Optional | \b 单词"结界"(word bounds) | |
| \S 匹配非white space(包括空格、tab等) | {min,max}出现次数在一个范围内 | ||
| . 匹配任何,任何的字符 | {n}匹配出现n次的 |
进阶内容
分类符
-
[]的作用,用英文表达就是"alternation",表达一个或的逻辑; -
/[-.(]/在符号中的连字符-放在第一位表示连字符本身,如果放在中间,表示"从..到..",比如[a-z]表示a-z -
[.)]括号中的特殊符号不需要转义,就表示其本身 -
[^ab]
括号中的^表示非,anythings exceptaandb -
(a|b)也可表示选择,但是它有更强大的功能....
分组捕获
- 分组捕获,使用()进行数据分组,编号0代表整个匹配项,选择的分组从1号开始
- 选择器可以使用
$1和\1,但是使用场景不同,\用在正则表达式自己身上
贪婪匹配
如何匹配HTML标签
-
<.+?> ?
符号可以禁止贪婪属性,放在.*`之后,表示一次匹配遇到重点就可以停止。否则将会一直向后匹配。 -
<[^<>]+> 匹配除了<和>的字符
前向匹配
- d(?=r) 只有d紧跟r才会匹配,但是r不是匹配串的一部分
- (?<=r)d 只有d前面是r才会匹配,但是r不是匹配串的一部分
- (?r)**d 只有d前面不是r才会匹配,但是r不是匹配串的一部分
在Python中的应用
反斜杠困境
在字符串之前加一个r可以保证匹配原始符号
| Regular String | Raw string |
|---|---|
"ab*" |
r"ab*" |
"\\\\section" |
r"\\section" |
"\\w+\\s+\\1" |
r"\w+\s+\1" |
分步匹配
编译Pattern objects
import re
p = re.compile('ab*',re.X) # 创建Pattern objects
Pattern objects编译标记
| Flag | Meaning |
|---|---|
IGNORECASE, I |
忽略大小写 |
MULTILINE, M |
多行匹配,会影响^ 和 $ |
Pattern objects常用方法
| Method/Attribute | Purpose |
|---|---|
match() |
返回匹配对象(Match Object) |
search() |
返回匹配的位置 |
findall() |
以列表形式返回所有匹配的子串 |
finditer() |
以迭代器形式返回所有匹配的子串 |
sub('替换串','待替换串',count=1) |
找到所有的字符串并替换 |
subn() |
和sub效果一样,但会多返回一个替换位置 |
Match object常用方法
- 调用相关方法前,先确定Match Object是否匹配
| Method/Attribute | Purpose |
|---|---|
| group() | 返回匹配的字符串 |
| start() | 返回匹配的起始位置 |
| end() | 返回匹配的结束位置 |
| span() | 返回匹配的起止位置 |
直接匹配
- 不在循环中进行正则匹配时可以考虑直接匹配
re.match(r'From\s+', 'From amk Thu May 14 19:12:10 1998')
<re.Match object; span=(0, 5), match='From '>


浙公网安备 33010602011771号