正则表达式必知必会
基本语法
速查表
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 except
aand
b -
(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 except
aand
b -
(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 '>