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

我使用运行

我使用运行

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

在 Perl 上删除不可打印的字符。

在 Python 中没有 POSIX 正则表达式类,我不能写 [:print:] 它意味着我想要的。我知道在 Python 中没有办法检测字符是否可打印。

你会怎么做?

编辑:它必须支持 Unicode 字符。string.printable 方式将愉快地将它们从输出中剥离出来。curses.ascii.isprint 将为任何 unicode 字符返回 false。

92

不幸的是,在 Python 中迭代字符串相当慢。对于这种事情,正则表达式要快一个数量级。您只需要自己构建字符类。unicodedata模块对此非常有帮助,尤其是unicodedata.category ()函数。有关类别的说明,请参阅Unicode Character Database

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)

对于某些用例,其他类别(例如,所有来自control组的类别可能更可取,尽管这可能会减慢处理时间并显着增加内存使用量。

Cc(控制):65

Cf(格式):161

Cs():2048

Co(私人使用):137468

Cn(未分配):836601

编辑从评论中添加建议。

84

据我所知,最 pythonic / 有效的方法是:

import string
filtered_string = filter(lambda x: x in string.printable, myStr)
20

您可以尝试使用unicodedata.category()函数设置过滤器:

import unicodedata
printable = {'Lu', 'Ll'}
def filter_non_printable(str):
  return ''.join(c for c in str if unicodedata.category(c) in printable)

有关可用类别,请参见Unicode database character properties中第 175 页的表 4-9

14

以下将使用 Unicode 输入,并且相当快...

import sys
# build a table mapping all non-printable characters to None
NOPRINT_TRANS_TABLE = {
    i: None for i in range(0, sys.maxunicode + 1) if not chr(i).isprintable()
}
def make_printable(s):
    """Replace non-printable characters in a string."""
    # the translate method on str removes characters
    # that map to None from the string
    return s.translate(NOPRINT_TRANS_TABLE)
assert make_printable('Café') == 'Café'
assert make_printable('\x00\x11Hello') == 'Hello'
assert make_printable('') == ''

我自己的测试表明,这种方法比遍历字符串并使用str.join返回结果的函数更快。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(345)
excel在计算单元格的数量时指向单元格
上一篇
如何在 C#中计算XIRR公式
下一篇

相关推荐

  • python浅拷贝和深拷贝区别、原理与实现

    示例示例Python中的浅拷贝和深拷贝是指在复制对象时,复制的结果和原来的对象之间的关系。浅拷贝:浅拷贝只复制一层,也就是说,它只复制最外围的对象,而不复制它包含的对象。如果最外围的对象中包含其他对象,那么这些对象将不会被复制,而是使用原来的对象。…

    2023-05-30 14:25:17
    0 88 75
  • python程序员待遇:Python程序员薪酬最高,收入惊人!

    Python程序员的待遇取决于他们的技能水平和工作经验。一般来说,Python程序员的薪资水平较高,尤其是对于那些有丰富工作经验的Python程序员而言,他们的薪资水平更高。此外,Python程序员还可以获得许多其他福利,包括住房补贴、交通补贴、带薪休假等。…

    2023-06-22 01:21:15
    0 24 34
  • python文本情感分析(含代码示例)

    Python文本情感分析是一种使用自然语言处理技术来分析文本中的情感倾向的过程。它可以帮助我们了解用户对特定主题的看法,从而改善产品和服务。…

    2023-04-23 00:28:07
    0 49 13
  • python字符串拼接数字从零开始

    实例实例Python字符串拼接数字,可以使用format()函数或者%运算符来实现。代码实例:…

    2023-08-20 08:25:28
    0 56 18
  • python中import re:如何使用Python中的re模块进行正则表达式匹配

    import re 是Python中正则表达式模块,可以用来处理字符串。它提供了一系列的函数,可以用来查找、替换和分割字符串,以及检查字符串是否符合特定的格式。…

    2023-05-02 10:25:33
    0 56 10
  • python是面向Python的优势

    Python是一种面向对象的编程语言,它提供了一种简单而强大的方法来创建可重用的代码。它使用类和对象来实现面向对象编程,允许程序员将代码封装在类中,以便在不同的程序中重复使用。…

    2023-05-02 04:34:35
    0 57 15
  • python中的%d:%d个原因你应该学习Python

    示例示例%d 是Python中格式化字符串的占位符,表示用整数来填充。示例:…

    2023-04-25 12:42:58
    0 76 59
  • python蟒蛇编程:如何使用Python蟒蛇编程构建你的程序

    Python蟒蛇编程是一种基于Python语言的编程方式,它可以帮助用户快速地创建和维护复杂的应用程序。它的特点是能够将复杂的任务分解为一系列的小步骤,并且每一步都有明确的目标。…

    2023-05-16 00:27:35
    0 47 79

发表评论

登录 后才能评论

评论列表(42条)