Python - 在使用正则表达式查找句点(句号或。)时,我是否应该使用字符串前缀?

时间:2013-10-08 14:06:27

标签: python regex string

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

在阅读了多个来源(链接如下)多次并尝试使用代码查找相同的结果(再次参见下文)后,我仍然不确定:

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

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

    '等等!'

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

    '等等!'

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

    ''

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

    ''

    我看过的消息来源:

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

    Regular expression to replace "escaped" characters with their originals

    Python regex - r prefix

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

1 个答案:

答案 0 :(得分:5)

原始字符串表示法就是指定字符串值的表示法。当使用正常字符串表示法识别的反斜杠转义时,符号会产生不同的字符串值。因为正则表达式附加了反斜杠字符的含义,所以原始字符串表示法非常方便,因为它避免了必须使用过多的转义。

引用Python Regular Expression HOWTO

  

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

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

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

当反斜杠+其他字符在常规字符串表示法中具有特殊含义时,原始字符串只会产生差异:

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

\b组合具有特殊含义;在常规字符串中,它被解释为退格符。但正则表达式将\b视为单词边界锚点,因此每次要在正则表达式中使用此字符串时,都必须在Python字符串中使用\\b。使用r'\b'可以更轻松地读取和编写表达式。

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