代码之家  ›  专栏  ›  技术社区  ›  QA Collective

如何在变量中存储反斜杠非转义字符串?

  •  0
  • QA Collective  · 技术社区  · 5 年前

    我有一个从LDAP返回的字符串似乎是“双转义的”:

    >>> escaped = "hello\\,world"
    

    我想将这个字符串解压并存储到另一个变量中,但是 decode

    >>> escaped.encode().decode('unicode_escape')
    'hello\\,world'
    

    结果是 print() 但是返回我想要的:

    >>> print(escaped)
    hello\,world
    

    result of that print to an IO stream ,但肯定有比这更优雅的解决方案吗?

    0 回复  |  直到 5 年前
        1
  •  1
  •   jsbueno    5 年前

    'hello\\world' 不是双重转义的-只是当显示字符串的内部表示(也称为“repr”)时,Python 避免使用反斜杠,以便您,查看此表示的人知道 \\

    当你打电话 print ,字符串表示通过另一个方法完成,该方法用于程序输出,即供程序用户使用。在此表示法中,“\”正确地呈现为“\”,而其他序列(如“\n”、“\t”、“\b”等)则呈现为它们所表示的真实字符(在本例中为“\x0a”、“\x09”和“\x07”—或“换行”、“制表符”和“退格”)。

    前者由Python通过调用 __repr__ 方法,这是任何Python交互环境用来显示表达式结果的方法。稍后的渲染,由 打印 调用对象的 __str__ repr(...) str(...) .

    此外,通过使用f字符串,可以很容易地在另一个文本片段中插入对象的所需视图。如果需要“str”视图,只需将对象作为表达式放置在 {} 在f字串里面。如果需要内部表示,则在结束之前 } ,包括 !r 顺序:

    In [192]: a = "Hello\world!"                                                                                             
    
    In [193]: a                                                                                                              
    Out[193]: 'Hello\\world!'
    
    In [194]: print(a)                                                                                                       
    Hello\world!
    
    In [195]: print(repr(a))                                                                                                 
    'Hello\\world!'
    
    In [196]: print(f"*{a}*{a!r}*")                                                                                          
    *Hello\world!*'Hello\\world!'*
    

    如您所见,即使只输入一个“\”,如果后面的字符没有形成已知的转义序列,“\”也被单独取下,但显示为“\”,因为我们人类没有义务记住哪些是有效的转义序列,哪些不是。另一方面,在文本字符串中键入一个“\”表示反冲是相当危险的,因为很有可能会创建一个意外的其他字符。在Python3.8(目前处于beta版)中,这甚至会产生语法警告:

    Python 3.8.0b2+ (heads/3.8:028f1d2479, Jul 17 2019, 22:42:16) 
    [GCC 9.1.1 20190503 (Red Hat 9.1.1-1)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> a = "hello\world!"
    <stdin>:1: SyntaxWarning: invalid escape sequence \w
    

    避免此警告的方法是始终键入double \\ 或者使用 r' 字符串的前缀:

    >>> a = r"hello\world!"