正则表达式

正则表达式(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)

了解更多 >> MDN文档:JavaScript - 正则表达式 Python3 文档:标准库 re - 正则表达式语法


Python中使用

re模块

re模块提供两种使用方式,两种方式效果一样:一种是直接调用re模块的函数,一般使用这种方式。另一种是先调用re.compile()生成正则对象,再通过对象调用方法,这种适用于一个正则表达式需要多次使用,因为会编译缓存所以速度更快。以match函数示例:

# 直接使用
result = re.match(pattern, string)

# 编译后使用
prog = re.compile(pattern)
result = prog.match(string)

了解更多 >> Python 文档:re Python 文档:正则表达式HOWTO Python 文档:re函数/re.compile()


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()

了解更多 >> Python文档:re函数 Python文档:正则表达式HOWTO/应用匹配


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/匹配对象


资源

语言或平台官网

相关网站