正则表达式
正则表达式用于描述文本模式,因此可以用来检测文本中是否存在特定模式,从更长的字符串中提取出子字符串,或者对文本进行一些调整。正则表达式可以非常简洁,用来描述特定的单词,也可以更复杂一些,用来查找像 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
- Blog Link: https://neo1989.net/CheatSheet/CHEATSHEET-Regular-Expressions/
- Copyright Declaration: 转载请声明出处。