📜  Python - 过滤 ASCII 范围内的字符串(1)

📅  最后修改于: 2023-12-03 15:18:53.026000             🧑  作者: Mango

Python - 过滤 ASCII 范围内的字符串

有时候我们需要过滤掉ASCII范围之外的字符。在Python中可以使用内置函数 filter() 来过滤字符串中不符合条件的字符,但由于Python3中字符串是Unicode编码的,因此我们需要对Unicode字符做处理。

过滤ASCII字符

我们可以使用 ord() 函数将字符转换为与ASCII码对应的整数值,如果该值位于ASCII码的范围内(即0到127之间),则说明该字符为ASCII字符。

下面是一个例子:

# 定义一个待过滤的字符串
s = "Héllo, 世界!"

# 过滤掉ASCII码之外的字符
s_filter = filter(lambda x: ord(x) < 128, s)

# 输出过滤后的字符串
print(''.join(s_filter)) # 输出结果为:Hello, !

在上面的代码中,我们定义了一个字符串 s,其中包含了一些非ASCII字符。通过使用 filter() 函数和 lambda 表达式,我们可以过滤掉这些非ASCII字符。最后,使用 join() 函数将过滤后的字符重新组成一个新的字符串并进行输出。

过滤Unicode字符

当待过滤的字符串中包含Unicode字符时,我们需要使用 unicodedata 模块中的 category() 函数来判断该字符是否为ASCII字符。

下面是一个例子:

import unicodedata

# 定义一个待过滤的字符串
s = "Héllo, 世界!"

# 过滤掉ASCII码之外的字符
s_filter = filter(lambda x: unicodedata.category(x)[0] != 'C', s)

# 输出过滤后的字符串
print(''.join(s_filter)) # 输出结果为:Héllo, 世界!

在上面的代码中,我们首先导入了 unicodedata 模块。接着,定义了一个带有Unicode字符的字符串 s。接着,我们使用 filter() 函数和 lambda 表达式来过滤掉非ASCII字符。这里的 lambda 函数调用了 unicodedata.category() 函数,返回值为该字符被归类到的Unicode字符类别。如果该字符为控制字符(Control)、格式字符(Format)、私有使用区域字符(Private Use)、同一语言文字中允许的字母和标点符号(Punctuation)或数字符号(Number),则将其过滤掉。最后,使用 join() 函数将过滤后的字符重新组成一个新字符串并进行输出。

上面的代码中 category() 函数只返回了字符在Unicode字符中被归类到的第一个分类,比如Control、Format等,具体的分类可参考Python官方文档中 unicodedata.category() 函数的定义。