2

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

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

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

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

"\$"在这种情况下会导致什么结果?为什么?我会想到"$"的。

4

3 回答 3

6

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

rbefore 字符串文字表示原始字符串,这意味着通常的转义序列,例如\nor\r不再被视为换行符或回车符,而是简单地\跟随nor r。要指定 a \,您只需要\原始字符串文字,而您需要将其加倍为\\普通字符串文字。这就是为什么在指定正则表达式1时通常使用原始字符串的原因。它减少了阅读代码时的混乱。如果使用普通字符串文字,则必须进行两次转义:一次用于普通字符串文字转义,第二次用于正则表达式中的转义。

"\$"在这种情况下会产生什么结果?为什么?我本来以为"$"

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

这种行为与 C/C++ 或 JavaScript 处理类似情况的方式略有不同:\被视为下一个字符的转义,并且只保留下一个字符。所以"\$"在那些语言中会被解释为$.

脚注

1:Python 中原始字符串的设计存在一个小缺陷:为什么 Python 的原始字符串文字不能以单个反斜杠结尾?

于 2013-02-27T21:32:32.070 回答
3

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

一般来说,r'...'反斜杠不会充当转义字符。

尝试

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

对比

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

因为'\$'它不是 python 中的转义序列,所以它实际上与'\\$'.

于 2013-02-27T21:31:21.863 回答
1

只问蛇:

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

基本上如果\x 会在 C 中创建一个转义字符,则在字符串前缀中使用 r 与\\x

>>> r'\123'=='\\123'
True
>>> r'\tab'=='\\tab'
True
于 2013-02-27T21:31:51.580 回答