You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Python原生字符串(r前缀)与正则表达式转义的疑问

Python正则中r前缀与转义括号的疑问解答

先理清楚两个不同层面的规则:

  • 字符串前加r前缀,是让Python字符串解析器把\当成普通字符,不会把它当作转义符去解析(比如不会把\n转成换行符),原封不动把字符串传给正则引擎。
  • 而在正则表达式语法里,()是特殊符号,用来标记分组、提取匹配的子内容。如果想匹配字符串里的普通括号(),就必须用\告诉正则引擎:这不是分组符号,就是普通的括号。

回到你看到的代码re.compile(r'(\(\d\d\d\)) (\d\d\d-\d\d\d\d)'):

  1. 因为加了r前缀,字符串里的\(会直接传给正则引擎,不会被Python解析成其他内容。
  2. 正则引擎拿到\(后,就会识别为普通的左括号(;同理\)代表普通的右括号)。
  3. 外层的()是正则的分组语法,用来把匹配到的(123)这个整体作为一个分组,方便后续提取。

举个对比例子:

  • 如果不用r前缀,你得写re.compile('\\(\\d\\d\\d\\) (\\d\\d\\d-\\d\\d\\d\\d)')——因为Python会先把\\解析成单个\,再传给正则引擎,才能表示普通括号,这样写起来麻烦又容易出错。
  • 用r前缀只需要写r'(\(\d\d\d\)) (\d\d\d-\d\d\d\d)',避免了双重转义的繁琐,可读性更高。

总结:r前缀管的是Python字符串层面的转义规则,正则引擎自身的语法转义(比如转义特殊符号())还是需要用\来实现,两者是不同层面的规则,互不冲突。

内容的提问来源于stack exchange,提问作者Carmen Lupu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:43:12