快乐的春饼

常见正则表达式的规则及使用

regex101

一个可以测试解释以及参考正则表达式的网站。

正则表达式规则

元字符说明示例
\d匹配数字 (0-9)\d → “5”
\w字母/数字/下划线 (a-z,0-9,_)\w+ → “Hello”
\b单词的开始或结束\bHello\b → " Hello "
.任意单个字符(换行除外)h. → “ha”
*0次或多次重复a* → “aa”
+1次或多次重复\d+ → “123”
?0次或1次重复a? → “a”
{n}精确匹配n次\d{3} → “123”
{n,}匹配n次或更多次\d{3,} → “123”
{n,m}匹配n到m次\d{3,4} → “123”
[ ]字符集合[a-c] → a/b/c
^开头匹配 / 取反^\d 开头为数字
$结尾匹配\d$ 结尾为数字
|a|b → a 或 b
[^x]除了x以外的字符[^a] 除了a的字符

捕获组

用圆括号括起来的部分就是捕获组,方便进一步获取内容。

在正则表达式内部或者正则替换时,可以用\k的方式来引用第k个捕获组。

不论捕获组是否嵌套,左括号更前,编号就更前。

捕获组索引从 1 开始,可以用(?P<name>...)的方式给捕获组命名。在正则表达式内部通过(?P=name)来引用命名捕获组;正则替换时用\g<name来引用对应的捕获组。

阻止贪心

正则表达式默认贪心匹配,即匹配最多的字符。比如.*会匹配尽量多的字符直到换行。

对此,加上一个?即可阻止贪心。例如对abc 123来说:

正则表达式捕获组内容
(.*)\s*[0-9]*abc 123
(.*?)\s*[0-9]*abc

Python re 使用

compile

编译正则表达式,加速后续运算:

pattern = re.compile(regex)

match

字符串是否匹配某一模式。

表达式作用
pattern.match(string)字符串开头是否匹配模式
pattern.fullmatch(string)字符串全部是否匹配模式

在字符串中找到匹配模式的子串。

表达式作用
result = pattern.search(string)查找匹配模式的第一个子串(找不到则为None
result.group() result.group(0)匹配到的子串
result.group(k)返回第k个捕获组或者命名捕获组
result.groups()所有捕获组的元组
result.start() result.end() result.span()匹配的起止位置

其他

表达式作用
pattern.findall(string)返回所有匹配结果
pattern.split(string)按模式分割字符串
pattern.sub(sub, string)正则替换
re.DOTALL点号匹配换行符