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

iyzzxitl  于 2023-04-07  发布在  Python
关注(0)|答案(2)|浏览(161)

python中的r string(r'foobar')和普通string('foobar')有什么区别?r'string'是正则表达式字符串吗?
我已经尝试了以下方法,对我的正则表达式匹配没有任何影响:

>>> 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']
pgpifvop

pgpifvop1#

r不表示“正则表达式字符串”;它的意思是“原始字符串”。根据文档:
字符串文字可以有选择地以字母'r''R'作为前缀;这样的字符串被称为“原始字符串”,并且使用不同的规则来解释反斜杠转义序列。
它们通常 * 用于 * 正则表达式(和recommended),因为正则表达式和非原始字符串 * 都 * 使用反斜杠作为转义字符。例如,将普通字符串中的正则表达式与文字反斜杠匹配将是'\\\\';用一个原始字符串,它就是'\\'

ntjbwcob

ntjbwcob2#

在使用反斜杠转义符的情况下,这种差异会变得明显:

>>> 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'

引用自String literal:
有几种语言提供了一种方法来指定一个文字在没有任何特定语言解释的情况下被处理。这避免了转义的需要,并产生了更清晰的字符串。
你也可以参考词法分析。

相关问题