一个菜鸟问题。我正在阅读有关在 python 中使用正则表达式的文档。我的印象是,使用原始字符串会按原样处理"\",而不考虑它后面的任何内容作为转义序列。然而,在我正在阅读的示例中,
>>> phoneNumRegex = re.compile(r'((ddd)) (ddd-dddd)')
>>> mo = phoneNumRegex.search('My phone number is (415) 555-4242.')
>>> mo.group(1)
'(415)'
>>> mo.group(2)
'555-4242'
显然,作者用"\"逃脱了"("。我想了解如何。我以为在带来处加上"r"会区别对待"\"。
是的,此代码转义了"("以定义正则表达式,但 Python 解释器在字符串中保留了"\"。
如果不使用原始字符串文字形式定义它,则必须编写:
phoneNumRegex = re.compile('(\(\d\d\d\)) (\d\d\d-\d\d\d\d)')
字符串文字中的是一个文字
,正是我们需要用来转义速记字符类和特殊正则表达式字符的东西。
(
是分组构造的开始,必须有一个闭合的未转义)
。这些(...)
从来都不是比赛的一部分。(
和)
是字面上的(
和)
,这些都是比赛的一部分。
将正则表达式引擎视为交付字符串的客户。Re需要d
。当你使用"\d"时,Python认为它是一个像n
这样的转义序列,但事实并非如此,所以它保留了,因为这是未知转义序列的默认行为,并为re引擎提供了
d
。当你编写r"d"
Python知道是一个文字
,并且会随时为re引擎提供
d
。