首页 > 解决方案 > 使用 Python 删除控制字符

问题描述

我有一个处理命令输出的脚本(aws help cli 命令)。

我逐行遍历输出,直到遇到文本“可用命令”时才开始实际的真正解析,此时我将标志设置为 true 并开始对每一行进行进一步处理。

我已经很好地工作了 - 但在 Ubuntu 上,我们遇到了一个问题:CLI以我以前从未见过的方式突出显示文本:

输出很长,所以我已经 grep 了有问题的特定行 - 见下文:

># aws ec2 help | egrep '^A'
>AVAILABLE COMMANDS
># aws ec2 help | egrep '^A' | cat -vet
>A^HAV^HVA^HAI^HIL^HLA^HAB^HBL^HLE^HE C^HCO^HOM^HMM^HMA^HAN^HND^HDS^HS$

我以前从未见过的是,每个被高亮显示的字母都是 X^HX 格式。我想应用 X^HX --> X 类型的简单转换(适用于所有 a-zA-Z)。

到目前为止我尝试了什么:我的解决方法是这样的 - 首先我删除这样的控制字符:

String = re.sub(r'[\x00-\x1f\x7f-\x9f]','',String)

但我仍然必须搜索完全丑陋的“AAVVAAIILLAABBLLEE”。我考虑使用进一步的正则表达式将双打变成单打,但这会捕捉到真正的双打并变得混乱。

我开始编写一个函数,该函数在构建的字母字符列表中进行迭代,以按描述进行翻译,我使用 hexdump 试图找出有问题的控制字符的确切 \x 代码,但无法使其工作 - 我可以删除H 但不是 ^。

我真的不想使用任何额外的模块,因为我想让人们可以使用它而不必安装额外的东西。总之,我有一个非常难看的解决方法,但我相信有人必须知道一种快速简单的方法来进行这种翻译。奇怪的是它似乎只出现在 Ubuntu 上。

标签: pythonregexamazon-web-servicespattern-matchingcontrol-characters

解决方案


在进一步研究之后,我能够制定一个解决方案:

from string import ascii_lowercase
from string import ascii_uppercase


def RemoveUbuntuHighlighting(String):
        for Char in ascii_uppercase + ascii_lowercase:
                Match = Char + '\x08' + Char
                String = re.sub(Match,Char,String)
        return(String)

看到以格式 (X\x08X) 突出显示的字符时,我仍然有点困惑,这种排列似乎确实不必要地重复了相同的信息。

我建议不熟悉阅读十六进制代码的人的另一件事是,每一对十六进制都根据它们的出现顺序交换。


推荐阅读