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

时间:2017-05-23 00:19:30

标签: python regex parsing rawstring

修改
我不确定这个问题是否正确阅读 我已经知道Python中的字符串格式是什么 我已经知道每一个小细节 请停止向我指导有关Python中字符串类型的问题。

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

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

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

感谢。

我正在修改一些语法规则来解析和创建
使用r' 'r" "的原始字符串语法规则的字符串。

  

为了记录,我已阅读 docs 并对原始字符串进行规则   这个问题特定于在原始字符串中转义分隔符。

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

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

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

如果在解析之后,字符串实际上不是原始图像的原始图像 看起来不像原版 解析后,在变量中,它现在变得无用。

这是一种疏忽,可能会在未来得到纠正吗?

就像现在一样,在我的实用程序中,我只能创建一个原始语法表单,但由于
这个bug,除非我从分隔符中取消,否则我无法解析它。

我的意思是,我想我可以这样做,因为它是制作字符串的直接反向,
但令人不安的是,词汇解析器在变量之后将变量留在变量中 解析过程。

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

代码

#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

要么

2 个答案:

答案 0 :(得分:1)

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

所以是的,这是设计 - 虽然它很混乱。

  

我想知道为什么我不能使用原始语法r""或者r''形式就此   原始字符串"字" s"并将它存在于一个变量中。

Python的原始字符串文字并非旨在表示每个可能的字符串。特别是,字符"'无法在r""r''中表示。当您使用原始字符串文字进行正则表达式模式时,这不是问题,因为模式\"'"\'"'\"\'是等效的(即,它们都匹配单个字符串"')。

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

答案 1 :(得分:1)

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

  

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

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

不幸的是,由于字符串必须是单引号或双引号,您必须在单引号字符串中转义单引号并在双引号字符串中使用双引号以避免语法错误,但' \\"word\'s\\" '指令告诉解释器要处理所有逃脱字面意思。此外,r从未用于字符串操作。