📅  最后修改于: 2023-12-03 15:18:53.026000             🧑  作者: Mango
有时候我们需要过滤掉ASCII范围之外的字符。在Python中可以使用内置函数 filter()
来过滤字符串中不符合条件的字符,但由于Python3中字符串是Unicode编码的,因此我们需要对Unicode字符做处理。
我们可以使用 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字符时,我们需要使用 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()
函数的定义。