-7

编辑
我不确定这个问题是否被正确阅读。
我已经知道 Python 中有哪些字符串格式
每一个小细节,我已经知道了。
请停止向我提出有关 Python 中字符串类型的问题。

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

我想知道为什么我不能在这个
原始字符串上使用原始语法 r"" 或 r'' 形式,"word's"并让它像这样存在于变量中。

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

谢谢。


我只是介绍了一些语法规则,以
使用和的原始字符串语法规则来解析r' '和创建字符串r" "

作为记录,我已经阅读了有关原始字符串的文档和规则。
该问题特定于转义原始字符串中的分隔符。

我有一个实用程序可以解析/生成其他字符串类型并用于
生产代码。

我很困惑,当字符串在变量中时,Python 不会删除转义分隔符的转义

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


如果在解析后,字符串看起来不像原始图像,则该字符串并不是真正的原始图像。
解析后,在一个变量中,它现在变得无用了。

这是一个疏忽吗,将来可能会更正吗?

就像现在一样,在我的实用程序中,我只能创建一个原始语法形式,但由于
这个错误,我无法解析它,除非我从分隔符中移除转义符。

我的意思是,我想我可以这样做,因为它与生成字符串是直接相反的,
但令人不安的是,词法解析器在
解析过程之后将这种人为的转义留在了变量中。

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

代码

#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

任何一个

4

2 回答 2

1

引用Python FAQ,Python 中的原始字符串文字“旨在简化为想要进行自己的反斜杠转义处理的处理器(主要是正则表达式引擎)创建输入”。由于正则表达式引擎将去除引号字符前面的反斜杠,因此 Python 不需要去除它。这种行为很可能永远不会改变,因为它会严重破坏向后兼容性。

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

我想知道为什么我不能在这个原始字符串 "word's" 上使用原始语法 r"" 或 r'' 形式,并让它像这样存在于变量中。

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

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

于 2017-05-23T00:53:25.670 回答
1

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

字符串和字节文字都可以选择以字母“r”或“R”作为前缀;此类字符串称为原始字符串,并将反斜杠视为文字字符。因此,在字符串文字中,原始字符串中的 '\U' 和 '\u' 转义不会被特殊处理。

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

不幸的是,由于字符串必须是单引号或双引号,因此您必须对单引号字符串中的单引号和双引号字符串中的双引号进行转义以避免语法错误,但该r指令告诉解释器按字面意思处理所有转义。此外,r无论如何,它从未打算用于字符串操作。

于 2017-05-23T01:00:38.267 回答