【问题标题】:Create and parse a Python Raw string literal R""创建和解析 Python 原始字符串文字 R""
【发布时间】:2017-10-22 18:18:48
【问题描述】:

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

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

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

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

谢谢。


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

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

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

当字符串在变量中时,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

要么

【问题讨论】:

  • r 是一条指令 not 以任何特殊方式解释字符串中的任何字符。此外,Python 解释器不会将单引号和双引号区分为字符串分隔符,只要它们成对匹配即可。字符串的以下表示完全等价:r'\'''\\\''"\\\'""\\'"r"\'"。这些表示中的每一个都引用由文字反斜杠和单引号组成的双元素字符串。
  • @DYZ - 这不是重复的,请阅读我的问题。另外,我不关心 C 风格的字符串,只关心原始语法文字。如果没有办法使用原始字符串语法将这个原始字符串 "word's" 放入变量中,不变,那么如果它是有意的,那么它是无用的。如果不是故意的,这是一个错误。这就是我的全部问题。我很好奇这种有害行为是否会在未来得到治愈,或者任何其他见解。就是这样。
  • 你的问题,坦率地说,相当混乱。 r 唯一做的就是关闭反斜杠的特殊含义。如果您的字符串没有任何反斜杠,添加 r 没有区别
  • @sln - 它不是没用的,它在编写正则表达式时非常有用,而且您不必转义每个反斜杠。仅此一项就可以节省时间。它旨在像那样工作 - 或者更确切地说,交换双引号和单引号时的“不一致”外观是 Python 语法的附属品 - 如果你可以以任何其他方式告诉解释器什么是字符串边界,你就不会遇到问题带有“原始”字符串。

标签: python regex parsing rawstring


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 您对以反斜杠结尾的字符串的长引号如何与 OP 甚至您自己的答案相关?
  • @DYZ OP 写道“这是设计使然吗?”和“这是一个疏忽,将来可能会更正吗?”。我相信这是OP问题的核心,所以这就是我回答的部分。引用是原始字符串文字 design 的权威来源,并解释了为什么在解析原始字符串文字时不删除反斜杠。这在我的回答的第一段中进行了总结。
  • 他的问题不是关于字符串末尾的反斜杠。这是一个完全不同的话题。
  • 你是对的,这不是 OP 所要求的。我已经编辑了我的答案。我认为指向 Python FAQ 的指针作为 r-strings 设计的官方来源很重要。
  • 感谢您的编辑和注释。我有一个实用程序可以解析并生成存在的每种字符串文字。该操作是反等价的。甚至 Dot-Net 的@"" 也是可逆的并且是正确的。就像我说的那样,我对将"word's" 放入字符串变量不感兴趣。我只关注原始字符串语法。如果这就是它在 python 中的样子,那么它无用而且显然是设计使然。我将继续他们并继续学习下一种语言。
【解决方案2】:

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

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

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

不幸的是,由于字符串必须是单引号或双引号,因此您必须在单引号字符串中转义单引号,在双引号字符串中转义双引号以避免语法错误,但 r 指令告诉解释器处理所有转义字面上地。此外,r 从来都不是用于字符串操作的。

【讨论】:

  • 谢谢。我很高兴你这么说Besides, r was never intended for string operation anyway。显然,完全没用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 2012-07-10
  • 2014-03-03
  • 2011-03-08
  • 1970-01-01
  • 2020-02-06
相关资源
最近更新 更多