当需要搜索查找匹配字符时,就需要用到正则表达式。如果需要写一些小爬虫,就经常需要和正则表达式打交道,其重要之处不言而喻。本篇博客用于记录一些常用的规则(以Go为例,其采用 RE2 语法,除了 \c、\C外,其与 Perl、Python 等语言的正则基本一致),以便之后需要用到时回来查阅。

头图来源:Mostima - Katann - pixiv


基本规则

字符

语法说明表达式示例匹配结果
一般字符匹配自身abcabc
.匹配任意除换行符(\n)外的字符(在DOALL模式中也能匹配换行符)a.cabc
\转义字符a\.c a\\ca.c a\c
[...]字符集,对应位置可以为字符集中的任意字符,可任意列出(如[abc])也可以给出范围(如[a-c]) 同时如果第一个字符是^则表示取反a[bcd]eabe或ace或ade
\d数字:[0-9]a\dca1c
\D非数字:[^\d]a\Dcabc
\s空白字符:[<空格>\t\r\n\f\v]a\sca c
\S非空白字符:[^\s]a\Scabc
\w单词字符:[A-Za-z0-9]a\wcabc
\W非单词字符:[^\w]a\Wca c

数量词(用在字符和分组之后)

语法说明表达式示例匹配结果
*匹配前一个字符0或无限次abc*ab或abccc
+匹配前一个字符1或无限次abc+abc或abccc
?匹配前一个字符0或1次abc?ab或abc
{m}匹配前一个字符m次ab{2}cabbc
{m,n}匹配前一个字符m到n次,其中m和n可省略,若省略m,则匹配0到n次;若省略n,则匹配m到无限次ab{1,2}cabc或abbc

边界匹配

语法说明表达式示例匹配结果
^匹配字符串开头,在多行模式中匹配每一行的开头^abcabc
$匹配字符串末尾,在多行模式中匹配每一行的末尾abc$abc
\A仅匹配字符串开头\Aabcabc
\Z仅匹配字符串末尾abc\Zabc
\b匹配\w和\W之间a\b!bca!bc
\B[^\b]a\Bbcabc

关于\b,其匹配的规则为:如果前面和后面的字符不全是w则匹配。亦可理解为匹配的是单词边界(比如\bapple则匹配apple,而bapple则不匹配,因为bapple中按照匹配规则来看\b的前面是字母b,属于\w,而\b后字母a也属于\w),而\B则刚好和\b相反。

逻辑与分组

语法说明表达式示例匹配结果
|或,左右的表达式匹配任意一个,优先匹配左边的表达式abc|defabc或def
(...)括起来的部分作为一个分组,分组将作为一个整体,可以在后面接数量词(abc){2}abcabc
(?P<name>..)分组,功能与(...)相同,但会为这个分组制定一个别名(?P<id>abc){2}abcabc(分组别名为id)
\<number>引用编号为<number>的分组匹配到的字符串(\d)abc\11abc1或2abc2
(?P=name)引用别名为<name>的分组匹配到的字符串(?P<id>d)abc(?P=id)1abc1或2abc2

特殊构造(不作为分组)

语法说明表达式示例匹配结果
(?:...)(...)不分组版本,匹配到的字符不作为分组。用于使用“|”或后接数量词(?:abc){2}abcabc
(?iLmsux)iLmsux中每个字符代表一种匹配模式,只能用在正则表达式开头,可选多个(?i)abcAbC
(?#..)#后的内容将作为注释被忽略abc(?#comment)123abc123
(?=..)之后的字符串内容需要匹配表达式才能成功匹配a(?=\d)之后是数字的a
(?!..)之后的字符串需要无法匹配表达式才能成功匹配a(?!\d)之后不是数字的a
(?<=..)之前的字符串内容需要匹配表达式才能成功匹配(?<=\d)a之前是数字的a
(?<!..)之前的字符串内容需要无法匹配表达式才能成功匹配

Some tricks

(.*)与(.*?) 贪婪匹配与懒惰匹配

(.*)为贪婪匹配,所谓贪婪即为越多越好,当正则表达式中包含能接受重复的限定符时,其通常的匹配尽可能多的字符。

(.*?)则是懒惰匹配,即越少越好,其实只要在给出限定符(*或+)后加上一个问号?,即可转化为懒惰匹配模式。懒惰匹配意味着匹配任意数量的重复,但一旦发现匹配成功即使之后的重复仍然符合条件也结束匹配。

可以举个栗子,现在有个字符串:abbabcabcabc。表达式:a.*b的匹配结果为abbabcabcabc;表达式:a.*?b的匹配结果为abbabc

最后修改:2021 年 10 月 13 日 11 : 52 AM
如果觉得我的文章对你有用,请随意赞赏