在Python中从字符串中剥离非可打印字符

110

我曾经经常跑步。

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

使用Perl来清除非可打印字符。

在Python中没有POSIX正则表达式类,我不能编写[:print:]表示我想要的意思。在Python中,我不知道有什么方法可以检测字符是否可打印。

你会怎么做?

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


使用PyPi regex模块,只需简单地使用regex.sub(r'[^[:print:]]+', '', text)即可。当然,还有很多其他选择。 - Wiktor Stribiżew
使用PyPi regex模块,只需简单地使用regex.sub(r'[^[:print:]]+', '', text)即可。当然,还有很多其他选择。 - undefined
16个回答

3

在Python中没有POSIX正则表达式类

使用regex库时会有:https://pypi.org/project/regex/

它得到良好的维护,支持Unicode正则表达式、Posix正则表达式等等。用法(方法签名)与Python的re非常相似。

从文档中可以看到:

[[:alpha:]]; [[:^alpha:]]

支持POSIX字符类。这些通常被视为\p{...}的另一种形式。

(我不是相关方,只是一个用户。)


2
下面这个比上面的更快。看一下。
''.join([x if x in string.printable else '' for x in Str])

1
"".join([c if 0x21<=ord(c) and ord(c)<=0x7e else "" for c in ss]) - evandrix

2

以下内容是由Ants Aasmashawnrad提供的答案改编而来:

nonprintable = set(map(chr, list(range(0,32)) + list(range(127,160))))
ord_dict = {ord(character):None for character in nonprintable}
def filter_nonprintable(text):
    return text.translate(ord_dict)

#use
str = "this is my string"
str = filter_nonprintable(str)
print(str)

在Python 3.7.7上进行测试


1
  1. 错误描述 运行复制和粘贴的Python代码时报告:

Python无效的非打印字符U+00A0

  1. 错误原因 复制的代码中的空格与Python中的格式不同;

  2. 解决方案 删除空格并重新输入空格。例如,上图中红色部分是异常空格。删除并重新输入空格即可运行;

来源:Python无效的非打印字符U+00A0


1

去除“空格”,

import re
t = """
\n\t<p>&nbsp;</p>\n\t<p>&nbsp;</p>\n\t<p>&nbsp;</p>\n\t<p>&nbsp;</p>\n\t<p>
"""
pat = re.compile(r'[\t\n]')
print(pat.sub("", t))

实际上,你也不需要方括号。 - tripleee

0

我使用了这个:

import sys
import unicodedata

# the test string has embedded characters, \u2069 \u2068
test_string = """"ABC⁩.⁨ 6", "}"""
nonprintable = list((ord(c) for c in (chr(i) for i in range(sys.maxunicode)) if
                        unicodedata.category(c) in ['Cc','Cf']))

translate_dict = {character: None for character in nonprintable}
print("Before translate, using repr()", repr(test_string))
print("After translate, using repr()", repr(test_string.translate(translate_dict)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接