如何取消转义反斜杠转义的字符串?[重复]

2025-01-14 08:50:00
admin
原创
99
摘要:问题描述:假设我有一个字符串,它是另一个字符串的反斜杠转义版本。在 Python 中,有没有一种简单的方法来取消转义该字符串?例如,我可以这样做:>>> escaped_str = '"Hello,\\nworld!"' >>> raw_str = ev...

问题描述:

假设我有一个字符串,它是另一个字符串的反斜杠转义版本。在 Python 中,有没有一种简单的方法来取消转义该字符串?例如,我可以这样做:

>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>> 

但是这需要将(可能不受信任的)字符串传递给 eval(),这存在安全风险。标准库中是否有一个函数可以接受字符串并生成一个没有安全隐患的字符串?


解决方案 1:

>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"

解决方案 2:

您可以使用ast.literal_eval安全的:

安全地评估表达式节点或包含 Python 表达式的字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和 None。(END)

像这样:

>>> import ast
>>> escaped_str = '"Hello,\\nworld!"'
>>> print ast.literal_eval(escaped_str)
Hello,
world!

解决方案 3:

所有给出的答案都会在通用 Unicode 字符串上中断。据我所知,以下内容在所有情况下都适用于 Python3:

from codecs import encode, decode
sample = u'mon€y\\nröcks'
result = decode(encode(sample, 'latin-1', 'backslashreplace'), 'unicode-escape')
print(result)

在最近的 Python 版本中,无需导入也可以运行此操作:

sample = u'mon€y\\nröcks'
result = sample.encode('latin-1', 'backslashreplace').decode('unicode-escape')

正如obataku所建议的,您也可以使用模块literal_eval中的方法ast,如下所示:

import ast
sample = u'mon€y\\nröcks'
print(ast.literal_eval(F'"{sample}"'))

或者当你的字符串确实包含字符串文字(包括引号)时像这样:

import ast
sample = u'"mon€y\\nröcks"'
print(ast.literal_eval(sample))

但是,如果您不确定输入字符串是否使用双引号或单引号作为分隔符,或者您根本无法假设它被正确转义,则literal_eval可能会引发一些SyntaxError问题,但编码/解码方法仍然有效。

解决方案 4:

对于 Python3,请考虑:

my_string.encode('raw_unicode_escape').decode('unicode_escape')

“raw_unicode_escape”编解码器编码为 latin1,但首先用转义'/uXXXX''UXXXXXXXX'形式替换所有其他 Unicode 代码点。重要的是,它与普通的“unicode_escape”编解码器不同,因为它不会触及现有的反斜杠。

因此,当应用正常的“unicode_escape”解码器时,新转​​义的代码点和最初转义的元素都会被平等对待,结果是未转义的本机 Unicode 字符串。

(“raw_unicode_escape”解码器似乎只关注'/uXXXX''UXXXXXXXX'形式,而忽略所有其他转义。)

文档:
https://docs.python.org/3/library/codecs.html? highlight=codecs#text-encodings

解决方案 5:

在 python 3 中,str对象没有decode方法,您必须使用bytes对象。ChristopheD 的答案涵盖了 python 2。

# create a `bytes` object from a `str`
my_str = "Hello,\\nworld"
# (pick an encoding suitable for your str, e.g. 'latin1')
my_bytes = my_str.encode("utf-8")

# or directly
my_bytes = b"Hello,\\nworld"

print(my_bytes.decode("unicode_escape"))
# "Hello,
# world"

解决方案 6:

自定义字符串解析器只解码一些反斜杠转义符,在本例中"'

def backslash_decode(src):
    "decode backslash-escapes"
    slashes = 0 # count backslashes
    dst = ""
    for loc in range(0, len(src)):
        char = src[loc]
        if char == "\\\":
            slashes += 1
            if slashes == 2:
                dst += char # decode backslash
                slashes = 0
        elif slashes == 0:
            dst += char # normal char
        else: # slashes == 1
            if char == '"':
                dst += char # decode double-quote
            elif char == "'":
                dst += char # decode single-quote
            else:
                dst += "\\\" + char # keep backslash-escapes like 
 or     
            slashes = 0
    return dst

src = "a" + "\\\\\" + r"\'" + r'\"' + r"
" + r"    " + r"x" + "z" # input
exp = "a" + "\\\"   +  "'"  +  '"'  + r"
" + r"    " + r"x" + "z" # expected output

res = backslash_decode(src)

print(res)
assert res == exp
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用