快乐的春饼

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

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 点号匹配换行符