我想知道在使用python regex查找句点(句号)时使用字符串前缀“r”时得到相同结果的原因。
在阅读了多个来源(链接如下)多次并尝试使用代码查找相同的结果(再次参见下文)后,我仍然不确定:
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
r前缀用于原始字符串 http://forums.udacity.com/questions/7000217/r-prefix-is-for-raw-strings
答案 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的结果解释你的字符串文字。这些函数不知道您是否使用了原始或普通的字符串文字语法。