Python中的r'string'和普通的'string'有什么区别?

6

在Python中,r字符串(r'foobar')和普通字符串('foobar')有什么区别?r字符串是正则表达式字符串吗?

我尝试了以下内容,但对我的正则表达式匹配没有任何影响:

>>> import re
>>> n = 3
>>> rgx = '(?=('+'\S'*n+'))'
>>> x = 'foobar'
>>> re.findall(rgx,x)
['foo', 'oob', 'oba', 'bar']
>>>
>>> rgx2 = r'(?=('+'\S'*n+'))'
>>> re.findall(rgx2,x)
['foo', 'oob', 'oba', 'bar']
>>>
>>> rgx3 = r'(?=(\S\S\S))'
>>> re.findall(rgx3,x)
['foo', 'oob', 'oba', 'bar']
2个回答

16

r 不表示“正则表达式字符串”,它的意思是“原始字符串”。根据文档所述:

字符串文字可以选择以字母'r''R'为前缀;这种字符串称为原始字符串,并使用不同的规则来解释反斜杠转义序列。

它们通常被用作(并且建议)用于正则表达式,因为正则表达式和非原始字符串使用反斜杠作为转义字符。例如,在普通字符串中使用正则表达式匹配一个文字反斜杠将会是'\\\\';而在一个原始字符串中使用,它只是'\\'


2
OP:还要阅读原始字符串表示法 - P̲̳x͓L̳

4

当您使用反斜杠转义字符时,差异将变得明显:

>>> s="foobar"
>>> import re
>>> re.sub('(o)\1', '', s)     # Using the backreference has no effect here as it's interpreted as a literal escaped 1
'foobar'
>>> re.sub(r'(o)\1', '', s)    # Using the backreference works!
'fbar'
>>> re.sub('(o)\\1', '', s)    # You need to escape the backslash here
'fbar'

引用自字符串字面值

一些语言提供了一种指定字面值将被处理而不进行任何特定于语言的解释的方法。这避免了需要转义,并产生更易读的字符串。

您可能还想参考词法分析


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接