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

2025-01-14 08:50:00
admin
原创
160
摘要:问题描述:假设我有一个字符串,它是另一个字符串的反斜杠转义版本。在 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3983  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2747  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   82  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   90  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   79  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用