You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何将ASCII控制字符转为转义序列且支持重复处理

解决方案

要实现符合要求的幂等转义函数,核心是只对原始控制字符进行转义,已转义后的普通字符不再处理。以下是具体实现:

def sani(s: str) -> str:
    # 定义特殊转义映射(对应\t、\n、\r这类简洁形式)
    escape_map = {
        '\t': '\\t',
        '\n': '\\n',
        '\r': '\\r'
    }
    
    # 列出所有需要转义的ASCII码(覆盖提供的完整对照表)
    escape_codes = [
        0,1,2,3,4,5,6,7,8,11,12,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
        127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,173
    ]
    
    # 为剩余控制字符生成\xXX格式的转义序列
    for code in escape_codes:
        char = chr(code)
        if char not in escape_map:
            escape_map[char] = f'\\x{code:02x}'
    
    # 逐个字符替换:只替换控制字符,普通字符直接保留
    return ''.join([escape_map.get(char, char) for char in s])

方案优势

  1. 幂等性保障:转义后的字符串由普通可打印字符(如\、n、x等)组成,这些字符不在escape_map的键中,重复调用sani不会对已转义内容再次处理,确保sani(s) == sani(sani(s))。
  2. 精确匹配转义规则:完全覆盖所有需要转换的字符,其中\t、\n、\r使用简洁转义形式,其他字符统一使用\xXX十六进制格式。
  3. 规避repr()缺陷:不会额外添加引号,也不会出现多次调用后反斜杠累积的问题。

测试示例

假设输入字符串:

s = '\x07Hello\nFish\x08World\r'

第一次调用结果:

result1 = sani(s)
# 实际存储为'\\x07Hello\\nFish\\x08World\\r',打印显示为\x07Hello\nFish\x08World\r

重复调用验证幂等性:

result2 = sani(result1)
result3 = sani(result2)
print(result1 == result2 == result3)  # 输出:True

内容的提问来源于stack exchange,提问作者Toothpick Anemone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:18:27