如何用 Python 判断一个字符串里出现了多少个汉字

2018-03-29 14:47:26 +08:00
 Livid
请教一种最简洁的实现方式,谢谢各位。
6746 次点击
所在节点    Python
16 条回复
lululau
2018-03-29 14:53:27 +08:00
len(re.findall(ur'[\u4e00-\u9fff]', sample)

不过我感觉在文本处理的技术层面,所谓“汉字”应该是没有准确定义的
SuperMild
2018-03-29 14:54:06 +08:00
如果要区分日语、俄语等各国语言就比较麻烦了
whoami9894
2018-03-29 14:54:48 +08:00
正则[\u4e00-\u9fa5]+
b821025551b
2018-03-29 14:58:02 +08:00
上面提供的 unicode 编码范围应该不完全,比如“㗊”这个字,它是不是汉字?
muziki
2018-03-29 15:00:01 +08:00
import jieba
larsenlouis
2018-03-29 15:23:12 +08:00
fork
2018-03-29 15:51:57 +08:00
@SuperMild 俄语里也会有汉字?
huhujin
2018-03-29 15:56:10 +08:00
```

class Char(object):
widths = [
(126, 1), (159, 0), (687, 1), (710, 0), (711, 1),
(727, 0), (733, 1), (879, 0), (1154, 1), (1161, 0),
(4347, 1), (4447, 2), (7467, 1), (7521, 0), (8369, 1),
(8426, 0), (9000, 1), (9002, 2), (11021, 1), (12350, 2),
(12351, 1), (12438, 2), (12442, 0), (19893, 2), (19967, 1),
(55203, 2), (63743, 1), (64106, 2), (65039, 1), (65059, 0),
(65131, 2), (65279, 1), (65376, 2), (65500, 1), (65510, 2),
(120831, 1), (262141, 2), (1114109, 1),
]

@classmethod
def get_char_width(cls, o):
o = ord(o)
if o == 0xe or o == 0xf:
return 0
for num, wid in cls.widths:
if o <= num:
return wid
return 1

@classmethod
def get_string_width(cls, string):
# 显示文字的宽度
return sum(map(cls.get_char_width, string))

```
hicdn
2018-03-29 16:08:03 +08:00
简单除暴实现,假设文本只包含 ASCII 字符和中文

In [50]: bs
Out[50]: b'>\xe5\xa6\x82\xe4\xbd\x95\xe7\x94\xa8 Python \xe5\x88\xa4\xe6\x96\xad\xe4\xb8\x80\xe4\xb8\xaa\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2\xe9\x87\x8c\xe5\x87\xba\xe7\x8e\xb0\xe4\xba\x86\xe5\xa4\x9a\xe5\xb0\x91\xe4\xb8\xaa\xe6\xb1\x89\xe5\xad\x97 - V2EX'

In [51]: s = bs.decode()

In [52]: s
Out[52]: '>如何用 Python 判断一个字符串里出现了多少个汉字 - V2EX'

In [53]: [i for i in s if ord(i) not in range(0x20, 0x7f)]
Out[53]:
['如',
'何',
'用',
'判',
'断',
'一',
'个',
'字',
'符',
'串',
'里',
'出',
'现',
'了',
'多',
'少',
'个',
'汉',
'字']
hicdn
2018-03-29 16:12:36 +08:00
接上条,\r 和 \n 也算进去了,用 0x00 替换 0x20
qsnow6
2018-03-29 16:25:30 +08:00
用正则去搜索 unicode 编码表应该是最优方案了
oncethink
2018-03-29 16:44:16 +08:00
!pip install zhon
import re
import zhon
len(re.findall('[{}]'.format(zhon.hanzi.characters),"中文"))
xpresslink
2018-03-29 23:12:47 +08:00
2E80 ~ 33FFh:中日韩符号区。收容康熙字典部首、中日韩辅助部首、注音符号、日本假名、韩文音符,中日韩的符号、标点、带圈或带括符文数字、月份,以及日本的假名组合、单位、年号、月份、日期、时间等。
3400 ~ 4DFFh:中日韩认同表意文字扩充 A 区,总计收容 6,582 个中日韩汉字。
4E00 ~ 9FFFh:中日韩认同表意文字区,总计收容 20,902 个中日韩汉字。
A000 ~ A4FFh:彝族文字区,收容中国南方彝族文字和字根。
AC00 ~ D7FFh:韩文拼音组合字区,收容以韩文音符拼成的文字。
F900 ~ FAFFh:中日韩兼容表意文字区,总计收容 302 个中日韩汉字。
FB00 ~ FFFDh:文字表现形式区,收容组合拉丁文字、希伯来文、阿拉伯文、中日韩直式标点、小符号、半角符号、全角符号等。
fanhaipeng0403
2018-03-30 10:21:02 +08:00
jieba
robinlovemaggie
2018-03-30 11:39:41 +08:00
面试算法题既视感。。。逃~~
cszhiyue
2018-03-31 12:23:22 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/442496

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX