Python中的正则表达式引用

时间:2013-02-27 21:23:57

标签: python regex

我应该如何声明正则表达式?

mergedData = re.sub(r'\$(.*?)\$', readFile, allData)

我有点想知道为什么会这样。我认为我需要使用r''来传递正则表达式。

mergedData = re.sub("\$(.*?)\$", readFile, allData)

在这种情况下"\$"会导致什么?为什么?我原以为"$"

3 个答案:

答案 0 :(得分:6)

  

我认为我需要使用r''来传递正则表达式。

字符串文字之前的

r表示原始字符串,这意味着通常的转义序列(例如\n\r)不再被视为换行符或回车符,而只是{ {1}}后跟\n。要指定r,您只需要原始字符串文字中的\,而您需要在普通字符串文字中将其加倍\。这就是为什么通常情况下原始字符串用于指定正则表达式 1 。它减少了阅读代码时的困惑。如果使用普通字符串文字,则必须进行两次转义:一次用于正常的字符串文字转义,第二次用于在正则表达式中转义。

  

\\导致这种情况的原因是什么?为什么?我原以为"\$"

在Python普通字符串文字中,如果"$"后面没有转义序列,则会保留\。因此,\会导致"\$"后跟\

此行为与C / C ++或JavaScript处理类似情况的方式略有不同:$被视为下一个字符的转义,只剩下下一个字符。因此,这些语言中的\将被解释为"\$"

<强>脚注

1 :Python中的原始字符串设计存在一个小缺陷:Why can't Python's raw string literals end with a single backslash?

答案 1 :(得分:3)

r'...' escapes sequences,如'\1'(对正则表达式中的第一个组的引用,但如果未转义,则与'\x01相同)。

一般来说,在r'...'中,反斜杠不会表现为转义字符。

尝试

 re.split('(.).\1', '1x2x3')  # ['1x2x3']

VS

 re.split(r'(.).\1', '1x2x3') # ['1', 'x', '3']

由于'\$'不是python中的转义序列,因此它与'\\$'字面上相同。

答案 2 :(得分:1)

问问蛇:

>>> r'\$(.*?)\$'=='\$(.*?)\$'
True
>>> r'\vert'=='\vert'
False
>>> r'\123'=='\123'
False
>>> r'\#23'=='\#23'
True

基本上如果\x would create an esacped character in C,则在字符串前缀中使用r与\\x相同:

>>> r'\123'=='\\123'
True
>>> r'\tab'=='\\tab'
True