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

质量保证集体

很多关于转义字符串的问题似乎与 Python 2 或转义 unicode 字符代码有关。

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

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

我想取消转义此字符串并将其存储到另一个变量中,但decode不返回我期望的内容:

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

print()然而a 的结果返回我想要的:

>>> print(escaped)
hello\,world

我知道我可以将打印结果捕获到 IO 流,但肯定有比这更优雅的解决方案吗?

杰斯布埃诺

'hello\\world'不是双重转义 - 只是在显示字符串的内部表示(又名“repr”)时,Python确实会转义反斜杠,因此您,查看此表示的人知道\\代表字符串中的实际单个反斜杠字符,而不是另一个字符的转义序列。

当您调用 时print,字符串表示是通过另一种方法完成的,该方法用于程序输出 - 即供程序用户使用。在这种表示中,“\”被正确地呈现为“\”,而其他序列,例如“\n”、“\t”、“\b”被呈现为它们所代表的真实字符(“\x0a”、在这种情况下为“\x09”和“\x07” - 或“LINE FEED”、“TAB”和“BACKSPACE”)。

前者是Python通过调用__repr__任何对象中的方法来渲染的,它是任何Python交互环境用来展示表达式结果的。稍后使用的渲染print会调用对象的__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!'*

如您所见,即使键入单个“\”,如果其后的字符没有形成已知的转义序列,则“\”将单独使用 - 但显示为“\”,因为我们人类没有义务记住哪些是有效的转义序列,哪些不是。另一方面,在文字字符串中输入一个表示反冲的“\”是非常危险的,因为很可能会创建一个意想不到的其他字符。在 Python 3.8(目前处于测试阶段)中,这甚至会产生语法警告:

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!"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何取消转义的反斜杠字符串?

如何在Java中的字符串中添加反斜杠

如何在字符串文字中转义反引号

Groovy:如何在字符串中包含反斜杠而不进行转义?

字符串文字,无需转义反斜杠

如何在不使用反斜杠的情况下转义整个字符串?

如何在PowerShell中替换反斜杠字符-替换字符串操作?

如何在Scala中从字符串中删除所有结尾的反斜杠?

使Perl处理字符串中的反斜杠转义

如何在Ruby中执行字符串替换而不进行反斜杠转义

如何在Python中忽略反斜杠作为转义字符?

如何在R中包含反斜杠的列中重命名字符串

字符串中的“转义”反斜杠

如何将双反斜杠PERLQQ转义的字符串解码为Perl字符?

如何在AWK变量中存储字符串(行)

如何在字符串变量中存储HTML块?

如何在字符串变量名称中包含反斜杠(在Java中)

转义字符串中的反斜杠

在字符串中转义反斜杠?

Powershell转义字符`(反引号)未转义字符串

curl中的变量向字符串添加反斜杠

如何使用反斜杠连接字符串变量以在 Powershell 中创建 UNC 路径

在 Swift 字符串文字中转义反斜杠

如何打印反斜杠转义的字符串以在 Python 中输出 '\n'?

如何在格式化的 python 字符串中转义单个反斜杠?

转义反斜杠在字符串中以“\\”形式出现

将带有反斜杠的 stdin 字符串存储到变量中

如何在python3中将反斜杠字符串转换为正斜杠字符串?

如何从 Python 中的字符串中删除反斜杠?