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等後端去做爲佳。功能與數據與視圖分開,纔是正確的框架。

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