创建并解析 Python 原始字符串文字 R""

Create and parse a Python Raw string literal R""

编辑
我不确定这个问题是否被正确阅读。
我已经知道 字符串格式 在 Python.
中是什么 每一个细节,我都已经知道了。
请停止让我回答有关 Python.

中字符串类型的问题

这是一个与问题字符串分隔符有关的特定问题
原始语法 构造的正文中。

我想知道为什么我不能在此使用原始语法 r"" 或 r'' 形式
原始字符串 "word's" 并将其存在于这样的变量中。

我为什么要这样做并不重要,但我已经在下面解释过了。

谢谢。


我只是复习一些语法规则来解析和创建
使用 r' 'r" " 的原始字符串语法规则的字符串。

For the record, I have read the docs and rules on raw strings.
The question is specific to escaping the delimiter within the raw string.

我有一个 parses/makes 其他字符串类型并被使用的实用程序
在生产代码中。

令我感到困惑的是,当字符串位于变量中时,Python 不会删除转义定界符的 escape

这是设计使然,即。不删除分隔符上的转义符或我是什么
希望,只是错过了解析过程的一部分。
基本上,一个错误?

如果在解析后字符串确实不是原始图像
看起来不像原来的样子。
解析后,在一个变量中,它现在变得无用了。

这是疏忽吗?将来可能会得到纠正吗?

现在,在我的实用程序中,我只能创建原始语法形式,但是由于
这个错误,我无法解析它,除非我从定界符中取消转义。

我的意思是,我想我可以这样做,因为它是制作字符串的直接逆过程,
但令人不安的是,词法解析器在变量 after
中留下了这种人为转义 解析过程。

这是我用来验证问题的一些代码:

代码

#python 2.7.12

print "Raw targt string test = \"word's\""

v1 = r' "word\'s" '     # => "word\'s" 
v2 = r" \"word's\" "    # => \"word's\"

print "using r' ' syntax, variable contains  " + v1
print "using r\" \" syntax, variable contains  " + v2

if len(v1) == len(v2) :
   print "length's are equal" 
else :
   print "length's are NOT equal" 

输出

Raw targt string test = "word's"
using r' ' syntax, variable contains   "word\'s" 
using r" " syntax, variable contains   \"word's\" 
length's are NOT equal

或者

引用 Python FAQ,Python 中的原始字符串文字是 "designed to ease creating input for processors (chiefly regular expression engines) that want to do their own backslash escape processing"。由于正则表达式引擎会去除引号字符前面的反斜杠,因此 Python 不需要去除它。这种行为很可能永远不会改变,因为它会严重破坏向后兼容性。

所以是的,这是设计使然——尽管它很混乱。

I want to know why I can't use the raw syntax r"" or r'' form on this raw string "word's" and have it exist in a variable just like this.

Python 的原始字符串文字并未设计为能够表示所有可能的字符串。特别是,字符串 "' 不能在 r""r'' 中表示。当您将原始字符串文字用于正则表达式模式时,这不是问题,因为模式 \"'"\'"'\"\' 是等价的(即,它们都匹配单个字符串 "').

但是请注意,您可以使用三引号原始字符串文字 r'''"word's"'''.

编写字符串 "word's"

这不是错误,这是预期的行为。使用 r 时,您是在告诉解释器解释您的字符串,好吧,是原始的 - 这意味着关闭所有转义序列并将反斜杠视为普通字符:

Both string and bytes literals may optionally be prefixed with a letter 'r' or 'R'; such strings are called raw strings and treat backslashes as literal characters. As a result, in string literals, '\U' and '\u' escapes in raw strings are not treated specially.

由于反斜杠被视为文字字符,当您执行 r' "word\'s" ' 时,它等同于编写 ' "word\\'s" ',并且由于您的双引号字符串具有不同的转义序列:r" \"word's\" " 它是相当于:' \"word\'s\" ' - 因此,它们不匹配(多一个反斜杠,加上不同的位置)。

不幸的是,由于字符串必须是单引号或双引号,您必须在单引号字符串中转义单引号,在双引号字符串中转义双引号以避免语法错误,但 r 指令告诉解释器从字面上对待所有转义。此外,无论如何,r 从未用于字符串操作。