【问题标题】:python remove ctrl-character from stringpython从字符串中删除ctrl字符
【发布时间】:2020-08-29 13:55:39
【问题描述】:

我有一堆 XML 文件分批转储到磁盘。 当我试图赞美它们时,我发现一些控制字符插入到属性中。

看起来像这样:

<root ^KIND="A"></root>

它应该是这样的:

<root KIND="A"></root>

现在在这种情况下,它很容易修复,只是一些正则表达式魔法:

import re
xml = re.sub(r'<([^>]*)\v([^>]*)>', r'<\1K\2>', xml)

但是后来需求发生了变化,我不得不将文档单独转储到磁盘上。 当然,我在保存之前先进行替换,这样我就不会再遇到这个问题了。

你看到了很多这样的文件,数以百万计......

所以,我准备再次从中提取一些数据。

这一次我遇到了一个新错误:

<root KIND="A"><CLASSIFICATION></CLASSIFICATIO^N></root>

它应该是这样的:

<root KIND="A"><CLASSIFICATION></CLASSIFICATION></root>

我不确定为什么我不断收到这些错误,而不是为什么总是插入“ctrl-characters”。到目前为止,这可能是纯粹的运气。

我在第一种情况下使用的正则表达式通常不会使用,^K 转换为垂直制表符,因此我可以再次匹配。但是有什么可以过滤掉任何 ctrl 字符吗?

【问题讨论】:

  • 您是否应该查看转储这些文件的内容?谁负责那段代码,它看起来如何?为什么将“控制字符”放入xml开始?我只知道转义字符 - 顺便说一句,控制字符是什么? CTRL 只是一个键修饰符 - 如果在文件中,它不会留下任何“痕迹”。
  • 嘿,我是倾销他们的人。 ctrl 修饰符不是故意插入的,它只是显示出来。 dumpint 进程只是使用 gzip 将字符串保存到磁盘
  • 如果我不得不冒险猜测......看起来你有一些菜单结构,并且 ^ 表示可以访问此菜单的快捷键 - 例如:Alt+K 激活 root thingy 和 Alt +N 激活分类 - 购买为什么一个在开头的 XML 标记中,另一个在结束的 XML 标记中。我认为这是完全无法回答的。
  • 好吧,如果你是:minimal reproducible example 的代码让我们复制问题
  • 好吧,将 100 万个 xml 结果转储到 999 999 个文件中,这些文件在哪里都可以,而一个则不是,原始文件中没有 ctrl 字符

标签: python regex xml parsing


【解决方案1】:

尝试使用翻译表来摆脱 ctrl-A 到 ctrl-Z:

in_chars = ''.join([chr(x) for x in range(1, 27)])
out_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
tr_table = str.maketrans(in_chars, out_chars)

# pass all strings through the translate table:
x = input('Enter text: ')
print(x.translate(tr_table))

打印:

Enter text: abc^Kdef
abcKdef

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多