正则表达式用于描述文本模式,因此可以用来检测文本中是否存在特定模式,从更长的字符串中提取出子字符串,或者对文本进行一些调整。正则表达式可以非常简洁,用来描述特定的单词,也可以更复杂一些,用来查找像 URL 中的顶级域名这样的不明确的字符模式。

本文是基于Python的解析引擎。

定义

  • 原字符:原字符是正则表达式中最基础的元素。它直接对应你写下的字符。比如,如果你想要代表一个 “r”,你直接写 r 就可以了。

  • 特殊字符:特殊字符用于告诉正则表达式引擎,接下来的字符有特殊的含义。我们通常在特殊字符前面加一个 \ ,它们可以用来表示一行的开头,一行的结尾,或匹配任何单独的字符。

  • 字符集:字符集是用来告诉正则表达式引擎,去寻找一组字符中的任意一个。它由 [ 和 ] 表示,你想要寻找的字符就放在这两个括号之间。

  • 捕获组:捕获组是由一对圆括号表示的。它们可以让你把多个正则表达式归为一组,然后对这个组应用其他正则表达式的功能,比如量词(后面会提到)。

锚点

锚点用于定位字符的前后位置。

语法 描述 示例 示例可匹配 示例不可匹配
^ 匹配行首 ^r rabbit
raccoon
parrot
ferret
$ 匹配行尾 t$ rabbit
root
trap
nice
\A 匹配行首 \Ar rabbit
raccoon
parrot
ferret
\Z 匹配行尾 t\Z rabbit
root
trap
nice
\b 匹配词首或词尾 \bfox\b the fox ran foxskin
\B 匹配非空格字符中间的字符 \Bee\B beef tree

匹配字符类型

你可以根据字符的类型进行匹配,比如字母、数字等,而不仅仅是特定的字符。

语法 描述 示例 示例可匹配 示例不可匹配
. 除了换行之外的所有内容 c.e clean
cheap
acert
cent
\d 匹配数字 \d 6060 ~ 228
2b
two
+*+
\D 匹配非数字 \D 6060 ~ 228
2b
12
333
\w 匹配单词字符 \wello\w hello呀 hell呀
\W 匹配非单词字符 hell\W hell🎸no hello
\s 匹配空白 hell\s hell\tno’ hello
\S 匹配非空白 hell\S hello hell no
\元字符 对元字符进行转义以匹配元字符 \.\.\. no no world

字符集合

字符集合是一组或一系列的字符。

语法 描述 示例 示例可匹配 示例不可匹配
[xy] 匹配指定的任意字符 r[ea] gray
great
grip
groot
[x-y] 匹配一段连续的字符 [a-e] amber
brand
fox
zoo
[^xy] 匹配指定之外的字符 r[ea] grip
groot
gray
great
[^-] 匹配指定的元字符 4[\^\.]\d 4.2
4^3
44
33

重复

你可以找出重复出现的字符,而不仅仅是单个的字符。

语法 描述 示例 示例可匹配 示例不可匹配
x* 匹配0个或多个 ar*o cacao
carrot
arugula
artichoke
x+ 匹配1个或多个 re+ green
tree
trap
ruined
x? 匹配0个或1个 ro?a roast
rant
root
rear
x{m} 匹配m次 \we{2}\w deer
seer
red
enter
x{m,} 匹配m次或更多 2{3,}4 2222224 224
x{m,n} 匹配m到n之间的次数 2{2,3}4 224
2224
24
22224
x+? 尽可能少地匹配,懒惰模式 re+? treeeeee trout

捕获,选择与反向引用

如果你想从一段字符串中提取特定的部分,你可以进行捕获操作,甚至可以给你捕获的这些部分命名。

语法 描述 示例 示例可匹配 示例不可匹配
(x) 捕获一个模式 (iss)+ Mississippi
missed
mist
persist
(?:x) 匹配但不捕获 (?:ab)(cd) abcd accd
(?P<name>x) 捕获且命名 (?P<a>\d)(?P<b>\d)\d* 1325
a: 1
b: 3
2
(x y) 匹配多种可能的模式 (re ba)
\n 引用之前的捕获,其中 n 是组索引,从 1 开始编号 (b)(\w*)\1 blob
bribe
bear
bring
(?P=name) 引用已命名的捕获 (?P<a>5)(\d*)(?P=a) 51245
55
523

前瞻后顾

你可以设定一些特定的字符必须在你的匹配项前后出现,但这些字符并不会被包含进匹配结果中。

语法 描述 示例 示例可匹配 示例不可匹配
(?=x) 预览接下来的字符,但不把它们纳入匹配结果中 an(?=an) banana band
(?!x) 预览下一个字符以避免匹配 ai(?!n) fail faint
(?<=x) 检查前面的字符以进行匹配,但不会把这些字符纳入匹配结果中 (?<=tr)a trail tail
(?<!x) 查看前面的字符以避免匹配 (?!tr)a bear trail

Reference

Regular Expressions