正则表达式
正则表达式(Regular Expression),简写regex、regexp或RE。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。通常被用来检索、替换那些符合某个模式(规则)的文本。
简介
时间轴
基本语法
一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。如this, that都可以由th(is|at)
这个模式来描述。
正则表达式由普通字符,比如:abc;或者是简单字符和特殊字符的组合,比如ab\*c。
元字符
特殊字符是由元字符或元字符和普通字符构成,比如\d表示匹配一个数字。元字符是有特殊意义的字符,它们被作为一般的字符使用时,必须要通过“转义”(前面加一个反斜杠“\”)来去除他们本身的特殊意义,这14个元字符如下:
. ^ $ * + ? { } [ ] \ | ( )
字符类
特殊字符 | 含义 | 示例 |
---|---|---|
. | 默认匹配除换行符之外的任何单个字符。如果指定了参数DOTALL ,它将匹配包括换行符的任意字符。 | .n 匹配 "nay, an apple is on the tree" 中的 'an' 和 'on'. |
\d | 匹配一个数字。等价于[0-9]。 | \d 匹配"B2 is the suite number."中的'2'。 |
\D | 匹配一个非数字字符。等价于[^0-9]。 | \D 匹配"B2 is the suite number."中的'B' 。 |
\w | 匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]。 | \w 匹配 "apple," 中的 'a'和 |
\W | 匹配一个非单字字符。等价于 [^A-Za-z0-9_]。 | \W匹配 "50%." 中的 '%'。"$5.28,"中的 '5'。 |
\s | 匹配一个空白字符,包括空格、制表符、换页符和换行符。 | \s\w*匹配"foo bar."中的' bar'。 |
\S | 匹配一个非空白字符。 | \S\w* 匹配"foo bar."中的'foo' |
[字符集] | 匹配方括号中的任意一个字符。特殊符号"\ * . "在字符集没有特殊意义。可以使用破折号(-)来指定一个字符范围。 | [abcd] 和[a-d]是一样的,可以匹配"brisket"中的‘b’和“city”中的‘c’。 |
[^字符集] | 反向字符集,匹配任何没有包含在方括号中的字符。可以使用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的。 | [^abc] 和 [^a-c] 是一样的。可以匹配"brisket"中的‘r’和匹配“chop”中的‘h’。 |
数量词
特殊字符 | 含义 | 示例 |
---|---|---|
* | 匹配前一个表达式 0 次或多次。等价于 {0,}。 | bo* 匹配 "A ghost boooooed" 中的 'booooo' 和 "A bird warbled" 中的 'b' |
+ | 匹配前面一个表达式 1 次或者多次。等价于 {1,}。 | a+ 匹配 "candy" 中的 'a' 和 "caaaaaaandy" 中的 'aaaaaaa'。 |
? | 匹配前面一个表达式 0 次或者 1 次。等价于 {0,1}。还用于先行断言中,如本表的 x(?=y) 和 x(?!y) 条目所述。 | e?le? 匹配 "angel" 中的 'el'、"angle" 中的 'le' 以及 "oslo' 中的 'l'。 |
{n} | n 是一个非负整数,匹配前一个字符刚好出现了n次。 | a{2}匹配“caandy”中的'aa'和“caaaandy”中的前面的'aa',但不匹配“candy”中的'a' |
{n,} | n 是一个非负整数,匹配前一个字符至少出现了n次。 | a{2,}匹配“caandy”中的'aa'和“caaaandy”中的'aaaa',但不匹配“candy”中的'a' |
{n,m} | m 和 n 均为非负整数,匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。 | a{1, 3} 匹配“candy”中的a和“caandy”中的'aa'和“caaaandy”中的前面'aaa',但不匹配“cndy”中的任意字符。 |
定位
特殊字符 | 含义 | 示例 |
---|---|---|
^ | 匹配输入的开始。如果多行标志被设置为 true,那么也匹配换行符后紧跟的位置。在下面的特殊字符[^xyz]表示不包含方括号中的字符。 | ^A 匹配 "An E" 中的 'A',但不会匹配 "an A" 中的 'A'。 |
$ | 匹配输入的结束。如果多行标志被设置为 true,那么也匹配换行符前的位置。 | t$ 匹配 "eat" 中的 't',但不匹配 "eater" 中的 't'。 |
\b | 匹配一个词的边界。 | \bm 匹配“moon”中的‘m’,但oo\b 不能匹配"moon"中的'oo',而 oon\b/匹配"moon"中的'oon'。 |
\B | 匹配一个非单词边界。 | \B..匹配"noonday"中的'oo',y\B..匹配"possibly yesterday"中的’yes‘。 |
分组
字符转义
特殊字符 | 含义 | 示例 |
---|---|---|
\n | 匹配一个换行符 (U+000A)。 | |
\r | 匹配一个回车符 (U+000D)。 | |
\t | 匹配一个水平制表符 (U+0009)。 | |
\v | 匹配一个垂直制表符 (U+000B)。 | |
\b | 匹配一个退格(U+0008)。 | |
\f | 匹配一个换页符 (U+000C)。 | |
其他
特殊字符 | 含义 | 示例 |
---|---|---|
\ | 转义特殊字符,或和其他字符构成特殊字符。 | \\ 匹配 \ ,\d 匹配数字 |
\cX | 匹配字符串中的一个控制符,当X是处于A到Z之间的字符的时候。 | \cM匹配字符串中的 control-M (U+000D)。 |
(x) | 分组,能够重复使用x表达式和提取该组匹配值。重复引用通过\n(数字)。改组的值在正则表达式的替换环节可以通过$n(数字)来获取。注意组值为第一次匹配值 | (f.o) \1 匹配'bar fao fao bar'中的'fao fao',python中值 |
(?:x) |
Python中使用
re模块
re模块提供两种使用方式,两种方式效果一样:一种是直接调用re模块的函数,一般使用这种方式。另一种是先调用re.compile()
生成正则对象,再通过对象调用方法,这种适用于一个正则表达式需要多次使用,因为会编译缓存所以速度更快。以match函数示例:
# 直接使用
result = re.match(pattern, string)
# 编译后使用
prog = re.compile(pattern)
result = prog.match(string)
re模块的函数
名称 | 描述 | 示例 |
---|---|---|
re.search() | 搜索整个字符串,返回一个成功的匹配 | re.match('e','hello') 返回一个匹配对象,第二个字母e
|
re.match() | 从起始位置开始搜索,返回从起始位置开始都成功的匹配。 | re.match('h','hello') 返回一个匹配对象,第一个h。 re.match('e','hello') 返回None
|
re.fullmatch() | 需要整个字符串都匹配,返回一个成功的匹配。3.4 新版功能。 | |
re.findall() | 查找所有匹配的字符串,返回匹配的字符串列表或字符串元组列表。 | |
re.finditer() | ||
re.split() | 用正则表达式分割。 | re.split(r'\W+', 'Words, words, words.') 返回['Words', 'words', 'words', '']
|
re.sub() | 用正则表达式替换 | |
re.subn() | ||
re.escape() |
re模块的匹配对象
search()、match()、fullmatch()等函数如果匹配到结果就会返回一个匹配对象,否则返回None。以下示例中的m也是表中示例m:
import re
m = re.search('\d+', '电话:123')
print(m.group()) # 123
print(m.span()) # (3, 6)
名称 | 描述 | 示例 |
---|---|---|
group() | 返回正则匹配的字符串 | |
groups() | ||
start() | 返回匹配的开始位置 | |
end() | 返回匹配的结束位置 | |
span() | 返回包含匹配 (start, end) 位置的元组 | |
了解更多 >> Python文档:re/匹配对象
资源
语言或平台官网
- PCRE官网:https://www.pcre.org/
- Python 标准库 re:https://docs.python.org/zh-cn/3/library/re.html
- .NET 正则表达式:https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/regular-expressions