3

我想知道在使用 python 正则表达式查找句点(句号)时使用字符串前缀“r”时得到相同结果的原因。

在多次阅读数字来源(下面的链接)并在代码中进行试验以找到相同的结果(再次参见下文)后,我仍然不确定:

  1. 使用正则表达式查找句点时,使用字符串前缀“r”和不使用字符串前缀“r”有什么区别?
  2. 哪种方式被认为是使用带有字符串前缀“r”或没有字符串前缀“r”的python正则表达式在字符串中查找句点的正确方法?

re.compile("\.").sub("!", "blah.")

“废话!”

re.compile(r"\.").sub("!", "blah.")

“废话!”

re.compile(r"\.").search("blah.").group()

'。'

re.compile("\.").search("blah.").group()

'。'

我看过的资料来源:

Python 文档:字符串文字 http://docs.python.org/2/reference/lexical_analysis.html#string-literals

正则表达式将“转义”字符替换为其原始字符

Python 正则表达式 - r 前缀

r 前缀用于原始字符串 http://forums.udacity.com/questions/7000217/r-prefix-is-for-raw-strings

4

1 回答 1

6

原始字符串表示法就是这样,一种指定字符串值的表示法。当涉及到由普通字符串表示法识别的反斜杠转义时,该表示法会产生不同的字符串值。因为正则表达式为反斜杠字符附加了含义,所以原始字符串表示法非常方便,因为它避免了过度转义。

引用Python 正则表达式 HOWTO

解决方案是对正则表达式使用 Python 的原始字符串表示法;在以 为前缀的字符串文字中,反斜杠不会以任何特殊方式处理'r',因此包含andr"\n"的两个字符的字符串也是如此,而包含换行符的一个字符的字符串也是如此。正则表达式通常会使用这种原始字符串表示法在 Python 代码中编写。'\''n'"\n"

该组合在常规python字符串中没有特殊含义,因此和的结果完全\.没有区别;你可以使用:'\.'r'\.'

>>> len('\.')
2
>>> len(r'\.')
2

仅当反斜杠 + 其他字符在常规字符串表示法中具有特殊含义时,原始字符串才会有所不同:

>>> '\b'
'\x08'
>>> r'\b'
'\\b'
>>> len('\b')
1
>>> len(r'\b')
2

\b组合具有特殊含义;在常规字符串中,它被解释为退格字符。但是正则表达式\b被视为一个单词边界锚,所以\\b每次你想在正则表达式中使用它时,你都必须在 Python 字符串中使用它。相反,使用r'\b'它可以更容易地阅读和编写你的表达式。

正则表达式函数传递字符串;Python 解释你的字符串文字的结果。这些函数不知道您使用的是原始字符串还是普通字符串文字语法。

于 2013-10-08T14:09:53.470 回答