【问题标题】:How to convert escaped characters?如何转换转义字符?
【发布时间】:2011-10-15 14:31:47
【问题描述】:

我想将包含转义字符的字符串转换为正常形式,就像 Python 的词法解析器一样:

>>> escaped_str = 'One \\\'example\\\''
>>> print(escaped_str)
One \'Example\'
>>> normal_str = normalize_str(escaped_str)
>>> print(normal_str)
One 'Example'

当然,无聊的方法是一一替换所有已知的转义字符: http://docs.python.org/reference/lexical_analysis.html#string-literals

你会如何在上面的代码中实现normalize_str()

【问题讨论】:

    标签: python string-formatting


    【解决方案1】:
    >>> escaped_str = '一个\\\'例子\\\'' >>> 打印 escaped_str.encode('string_escape') 一个\\\'例子\\\' >>> 打印 escaped_str.decode('string_escape') 一个“例子”

    几个类似的编解码器是available,例如rot13和hex。

    上面是 Python 2.x,但是——既然你说(在下面的评论中)你正在使用 Python 3.x——虽然解码 Unicode 字符串对象是迂回的,但它是still possible。编解码器也已重命名为“unicode_escape”:

    Python 3.3a0(默认:b6aafb20e5f5,2011 年 7 月 29 日,05:34:11) [GCC 4.4.3] 在 linux2 上 键入“帮助”、“版权”、“信用”或“许可”以获取更多信息。 >>> escaped_str = "一个\\\'例子\\\'" >>> 导入编解码器 >>> 打印(codecs.getdecoder("unicode_escape")(escaped_str)[0]) 一个“例子”

    【讨论】:

    • 一个好的转折值得另一个 :) 我曾经发现我可以通过编写自己的字符串编解码器 FWIW 来优雅地解决问题。
    • 这种方法在 Python 3 中似乎不起作用。我得到:AttributeError: 'str' object has no attribute 'decode'。
    • 在 python 3 中,strbytesunicodestr。您可能需要先“编码”为 utf8 或 ascii(以获取字节),然后从“string_escape”解码
    【解决方案2】:

    我认为问题是:

    我有一个字符串,它的格式就像它是 Python 源代码的一部分。我怎样才能安全地解释它,以便将字符串中的\n 转换为换行符,两端都需要引号等?

    试试ast.literal_eval

    >>> import ast
    >>> print ast.literal_eval(raw_input())
    "hi, mom.\n This is a \"weird\" string, isn't it?"
    hi, mom.
     This is a "weird" string, isn't it?
    

    为了比较,另辟蹊径:

    >>> print repr(raw_input())
    "hi, mom.\n This is a \"weird\" string, isn't it?"
    '"hi, mom.\\n This is a \\"weird\\" string, isn\'t it?"'
    

    【讨论】:

    • literal_eval 需要有效的字符串文字,包括开始/结束引号。添加引号(问题中的示例没有引号)有几种极端情况,具体取决于您要接受的输入类型。
    • @Fred 非常正确;但我想在大多数情况下,这确实是您要解决的问题,开始/结束引号实际上是存在的,即使 OP 将它们排除在示例之外。 :)
    • 我不确定这是否真的是您一直想要解决的问题:我猜 string_escape 编解码器(如我的回答)的存在是为了满足在没有字符串文字。 (指出literal_eval 仍然有用;我是赞成票。;)
    【解决方案3】:

    SingleNegationElimination 已经提到了这一点,但这里是一个例子:

    在 Python 3 中:

    >>>escaped_str = 'One \\\'example\\\''
    >>>print(escaped_str.encode('ascii', 'ignore').decode('unicode_escape'))
    One 'example'
    

    【讨论】:

    • 对于从iw wlan0 scan 获得的 SSID,这给了我编码错误。解决了这个问题:print(ssid.encode().decode('unicode_escape').encode('latin1').decode('utf-8')) --- 感谢您让我走上正轨,Attaque!
    【解决方案4】:

    不成对的反斜杠只是表示的产物,实际上并没有在内部存储。如果尝试手动执行此操作,可能会导致错误。

    如果您唯一的兴趣是删除前面没有奇数反斜杠的反斜杠,您可以尝试使用 while 循环:

    escaped_str = 'One \\\'example\\\''
    chars = []
    i = 0
    while i < len(escaped_str):
        if i == '\\':
            chars.append(escaped_str[i+1])
            i += 2
        else:
            chars.append(escaped_str[i])
            i += 1
    fixed_str = ''.join(chars)
    print fixed_str
    

    事后检查你的变量,你会明白为什么你试图做的事情没有意义。

    ...但是在旁注中,我几乎 100% 确定“就像 Python 的词法解析器一样”,它没有使用解析器,可以这么说。解析器用于语法,它描述了将单词组合在一起的方式。

    您可能正在考虑词汇内容验证,这通常使用正则表达式来指定。解析器是一种更具挑战性和更强大的野兽,而不是您为了线性字符串操作而想乱搞的东西。

    【讨论】:

    • OP 所谓的“词法解析器”可能更准确地称为 词法分析器,Python 确实有。幸运的是,我们不必重新发明它。它反映在一些细节上 - 请参阅我的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    相关资源
    最近更新 更多