python如何識別字符串有多少箇中文字符

前言:html

這種需求並不經常使用,python主要用於爬取數據,對於數據有效性問題,應該在輸入以前就限制。例如QT輸入框可以限制,html輸入也能限制。java

對於c/c++、mysql等,普通字符佔1個字節,中文佔2個字節。只需直接求字節數就好。可是python並不是如此,python的len計算的長度僅僅是「字符數」的意思。python寫到mysql等有字節長度限制的庫裏就會出問題。python

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

那麼如何知道真實字節長度呢?或者說,知道有多少箇中文呢?mysql

 

方法1:正則識別中文法

大部分的中文字符在\u4e00-\u9fa5間。用正則能夠識別出這些中文。只須要len一下結果就知道有多少箇中文。c++

實際字節數 = 中文數 + len(原字符串)sql

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

中文字符個數 = (解碼後字符個數 - 字符個數)//2spa

因爲每一箇中文字符數變成了3,因此。

實際在數據庫佔字節數 = 原字符數 + 中文個數

 

後記:

在python中,是幾乎沒有辦法徹底匹配出中文字符的。實際做用也不大。python主要用途仍是爬蟲客戶端。讀寫數據庫的事交給c java .net等後端去作爲佳。功能與數據與視圖分開,纔是正確的框架。

相關文章
相關標籤/搜索