关于Python原生字符串(r前缀)与正则表达式转义的疑问
Python正则中r前缀与转义括号的疑问解答
先理清楚两个不同层面的规则:
- 字符串前加
r前缀,是让Python字符串解析器把\当成普通字符,不会把它当作转义符去解析(比如不会把\n转成换行符),原封不动把字符串传给正则引擎。 - 而在正则表达式语法里,
()是特殊符号,用来标记分组、提取匹配的子内容。如果想匹配字符串里的普通括号(),就必须用\告诉正则引擎:这不是分组符号,就是普通的括号。
回到你看到的代码re.compile(r'(\(\d\d\d\)) (\d\d\d-\d\d\d\d)'):
- 因为加了
r前缀,字符串里的\(会直接传给正则引擎,不会被Python解析成其他内容。 - 正则引擎拿到
\(后,就会识别为普通的左括号(;同理\)代表普通的右括号)。 - 外层的
()是正则的分组语法,用来把匹配到的(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
相关产品推荐
相关产品推荐

