当前位置: 首页 > 面试题库 >

从python中的字符串中剥离不可打印的字符

宿淳
2023-03-14
问题内容

我过去跑步

$s =~ s/[^[:print:]]//g;

在Perl上摆脱不可打印的字符。

在Python中,没有POSIX正则表达式类,因此我无法编写[:print:]来表示我想要的含义。我不知道在Python中无法检测字符是否可打印。

你会怎么做?

编辑:它也必须支持Unicode字符。string.printable方式会很乐意将它们从输出中剥离。curses.ascii.isprint将为任何unicode字符返回false。


问题答案:

不幸的是,在Python中遍历字符串相当慢。对于这种事情,正则表达式的速度要快一个数量级。您只需要自己构建角色类即可。该 unicodedata
模块是这个相当有帮助,尤其是 unicodedata.category()
函数。有关类别的说明,请参见Unicode字符数据库。

import unicodedata, re, itertools, sys

all_chars = (chr(i) for i in range(sys.maxunicode))
categories = {'Cc'}
control_chars = ''.join(c for c in all_chars if unicodedata.category(c) in categories)
# or equivalently and much more efficiently
control_chars = ''.join(map(chr, itertools.chain(range(0x00,0x20), range(0x7f,0xa0))))

control_char_re = re.compile('[%s]' % re.escape(control_chars))

def remove_control_chars(s):
    return control_char_re.sub('', s)

对于Python2

import unicodedata, re, sys

all_chars = (unichr(i) for i in xrange(sys.maxunicode))
categories = {'Cc'}
control_chars = ''.join(c for c in all_chars if unicodedata.category(c) in categories)
# or equivalently and much more efficiently
control_chars = ''.join(map(unichr, range(0x00,0x20) + range(0x7f,0xa0)))

control_char_re = re.compile('[%s]' % re.escape(control_chars))

def remove_control_chars(s):
    return control_char_re.sub('', s)

对于某些用例,最好使用其他类别(例如,来自 控制 组的所有类别),尽管这可能会减慢处理时间并显着增加内存使用。每个类别的字符数:

  • Cc控制):65
  • Cf (格式):161
  • Cs (代理):2048
  • Co (私人使用):137468
  • Cn (未分配):836601

编辑 从注释中添加建议。



 类似资料:
  • 问题内容: 当在HTML文件中打印一行时,我试图找到一种仅显示每个HTML元素的内容而不显示格式本身的方法。如果找到,它将仅打印“某些文本”,打印“ hello”,等等。如何去做呢? 问题答案: 我一直使用此函数来剥离HTML标记,因为它仅需要Python stdlib: 对于Python 3: 对于Python 2:

  • 问题内容: 我有一个不错的代码片段,但是我想知道是否有人对如何执行此操作有更好的建议: 你会怎么做? 问题答案: 您可以使用正则表达式(使用 模块)来完成同样的事情。下面的示例匹配(非十进制数字或句点的任何字符)的游程,并将其替换为空字符串。请注意,如果使用标志编译模式,则结果字符串仍可能包含非ASCII数字。同样,删除“非数字”字符后的结果不一定是有效数字。

  • 问题内容: 考虑一个非DOM场景,您想使用JavaScript / ECMAScript从字符串中删除所有非数字字符。范围内的任何字符都应保留。 您将如何用纯JavaScript实现此目标?请记住,这是一个非DOM方案,因此jQuery和其他涉及浏览器和按键事件的解决方案都不适合。 问题答案: 使用正则表达式为的字符串方法,这是与所有非数字匹配的速记字符类:

  • 问题内容: 如何从字符串中删除HTML标签,以便可以输出纯文本? 问题答案: 嗯,我尝试了您的功能,并在一个小例子上工作了: 你能举一个例子吗? Swift 4和5版本:

  • 问题内容: 使用Python从字符串中剥离所有非字母数字字符的最佳方法是什么? 这个问题的PHP变体中提供的解决方案可能会进行一些小的调整,但对我来说似乎并不是很“ pythonic”。 作为记录,我不仅要删除句点和逗号(以及其他标点符号),还希望删除引号,方括号等。 问题答案: 使用Python从字符串中剥离所有非字母数字字符的最佳方法是什么? 这个问题的PHP变体中提供的解决方案可能会进行一些

  • 问题内容: 使用Python从字符串中剥离所有非字母数字字符的最佳方法是什么? 这个问题的PHP变体中提供的解决方案可能会进行一些小的调整,但对我来说似乎并不是很“ pythonic”。 作为记录,我不仅要删除句点和逗号(和其他标点符号),而且还要删除引号,方括号等。 问题答案: 我只是出于好奇而对某些功能进行了计时。在这些测试中,我从字符串(内置模块的一部分)中删除了非字母数字字符。发现使用已编