python原始字符串转义字符

时间:2016-02-05 14:33:15

标签: python regex escaping

一个菜鸟问题。我正在阅读有关在python中使用正则表达式的文档。我的印象是使用原始字符串会对待' \'因为它是并且不考虑任何跟随它作为逃脱序列。然而,在我阅读的例子中,

>>> phoneNumRegex = re.compile(r'(\(\d\d\d\)) (\d\d\d-\d\d\d\d)')
>>> mo = phoneNumRegex.search('My phone number is (415) 555-4242.')
>>> mo.group(1)
'(415)'
>>> mo.group(2)
'555-4242'

显然,作者已经逃脱了'('和#39;。我想知道怎么做。我想把一个' r'带到我会毫不犹豫地对待。

2 个答案:

答案 0 :(得分:5)

是的,此代码转义'('用于定义正则表达式,但Python解释器在字符串中保留'\'。

如果不使用原始字符串文字形式定义它,则必须编写:

phoneNumRegex = re.compile('(\\(\\d\\d\\d\\)) (\\d\\d\\d-\\d\\d\\d\\d)')

答案 1 :(得分:4)

原始字符串文字中的\是文字\,正是我们需要使用它来转义速记字符类和特殊正则表达式字符。

(是分组结构的开头,必须有未结合的)这些(...)永远不会成为比赛的一部分\(\)是文字(),这些都是匹配的一部分。

将正则表达式引擎视为提供字符串的客户。需要\d。当你使用" \ d"时,Python认为它是一个转义序列,如\n,但它不是,所以它保留\,因为这是未知转义序列的默认行为并将\d提供给引擎。当你写r"\d"时,Python知道\是一个文字\,并且很容易向重新引擎提供\d