python如何识别字符串有多少个中文字符

前言:

这种需求并不常用,python主要用于爬取数据,对于数据有效性问题,应该在输入之前就限制。例如QT输入框能够限制,html输入也能限制。

对于c/c++、mysql等,普通字符占1个字节,中文占2个字节。只需直接求字节数就好。但是python并非如此,python的len计算的长度仅仅是“字符数”的意思。python写到mysql等有字节长度限制的库里就会出问题。

l = '中国123'
print(len(l))
#5

那么如何知道真实字节长度呢?或者说,知道有多少个中文呢?

 

方法1:正则识别中文法

大部分的中文字符在\u4e00-\u9fa5间。用正则可以识别出这些中文。只需要len一下结果就知道有多少个中文。

实际字节数 = 中文数 + len(原字符串)

l = '我的34世界123'
print(re.findall('([\u4e00-\u9fa5])',l))
#['我', '的', '世', '界']

但是这有个bug,虽然能获取大部分中文,但一些中文字符或少用字是检测不出来的

l = '我的34世¥界123'
re.findall('([\u4e00-\u9fa5])',l)
#['我', '的', '世', '界']

 

方法2:解码

大多数时候,我们并不需要提取中文,仅仅知道真实长度就够了。(例如写入有约束的数据库之类的)

利用encode可以知道解码后uncode文本。但是中文字符长度会变成3!

l = '我的世¥界123'
#字符个数
print(len(l))
#8

#字符解码
print(l.encode())
#b'\xe6\x88\x91\xe7\x9a\x84\xe4\xb8\x96\xef\xbf\xa5\xe7\x95\x8c123'

#解码后字符个数
print(len(l.encode()))
#18

#中文个数
print((len(l.encode())-len(l))//2)
#5

#数据库占字节数
print(len(l)+(len(l.encode())-len(l))//2)
#13

中文字符个数 = (解码后字符个数 - 字符个数)//2

由于每个中文字符数变成了3,所以。

实际在数据库占字节数 = 原字符数 + 中文个数

 

后记:

在python中,是几乎没有办法完全匹配出中文字符的。实际作用也不大。python主要用途还是爬虫客户端。读写数据库的事交给c java .net等后端去做为佳。功能与数据与视图分开,才是正确的框架。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章