设为首页 收藏本站
查看: 697|回复: 0

[经验分享] 与汉字处理有关的Python实用例程

[复制链接]

尚未签到

发表于 2017-5-7 08:51:58 | 显示全部楼层 |阅读模式
  1. 判断字符串中是否含有汉字。


def has_hz(text):
hz_yes = False
for ch in text:
if isinstance(ch, unicode):
if unicodedata.east_asian_width(ch)!= 'Na':
hz_yes = True
break
else:
continue   
return hz_yes
  单元测试:

        assert not has_hz("")
assert not has_hz("  ")
assert not has_hz("123")
assert not has_hz(u"123abc")
assert has_hz(u"123abc汉字")
assert has_hz(u"汉字")
  2.隔指定长度插入一个换行符(\n),一个汉字算2个字符长。


def get_hz_string_width(text):
"""
获取可能包含汉字的字符串的长度(1个汉字算2个字符长)
"""
s = 0
for ch in text:
if isinstance(ch, unicode):
if unicodedata.east_asian_width(ch)!= 'Na':
s += 2
else:
s += 1
else:
s += 1
return s
def get_hz_sub_string(text,startat,sub_len=None):
"""
获取可能包含汉字的字符串的子串(计算长度时,1个汉字算2个字符长)
用法:
get_hz_sub_string(record,0,44)  #取子串,位置为0至43
get_hz_sub_string(record,44)    #取子串,位置为44至末尾
"""
s = []
pos = 0
for ch in text:
if pos >= startat:
s.append(ch)
if isinstance(ch, unicode):
if unicodedata.east_asian_width(ch)!= 'Na':
pos += 2
else:
pos += 1
else:
pos += 1
if sub_len!=None and get_hz_string_width(''.join(s))>=sub_len:
break   
return ''.join(s)
def insert_line_feed(my_str,interval,line_feed="\n"):
"""隔指定长度插入一个\n符号(一个汉字处理为2个字符长度)"""
if len(my_str)==0:
return ""
n = int((get_hz_string_width(my_str)-1)/interval)+1
str_list = []
k = 1
pos_start = 0
while k <= n:
sub_str = get_hz_sub_string(my_str,pos_start,interval)
str_list.append(sub_str)
k = k + 1
pos_start = pos_start + get_hz_string_width(sub_str)
return line_feed.join(str_list)   

  单元测试:

        assert insert_line_feed("",1)==""
assert insert_line_feed("1",1)=="1"
assert insert_line_feed("1234567890",5)=="12345\n67890"
assert insert_line_feed(u"汉字1汉字234567890",5)==u"汉字1\n汉字2\n34567\n890"
assert insert_line_feed(u"汉字1汉字234567890",4)==u"汉字\n1汉字\n2345\n6789\n0"

  3. 按指定长度为文字块分行(类似Word效果),并取消末尾的空行。


def wrap_text_block(text,line_length,do_trim=True):
if do_trim:
str_list = split(text.rstrip(),'\n')
else:   
str_list = split(text,'\n')
#检测末尾空行的开始位置
text_to_line = -1
if do_trim:
i = len(str_list)-1
while i > 0:
line_str = str_list
if len(line_str.strip())==0:
text_to_line = i
i -= 1
else:
break     
new_str_list = []
i = 0
for obj in str_list:
if do_trim and i == text_to_line:
break
new_str_list += split(insert_line_feed(obj,line_length),'\n')
i += 1
#不加 u'' 就出错“'unicode' object is not callable”!?
return u''+'\n'.join(new_str_list)   

   单元测试:

        assert wrap_text_block("",1)==""
assert wrap_text_block("",1,do_trim=False)==""
assert wrap_text_block(u"文字1234",2)==u"文\n字\n12\n34"
assert wrap_text_block(u"文字12345    ",2)==u"文\n字\n12\n34\n5"
assert wrap_text_block(u"文字1\n234",2)==u"文\n字\n1\n23\n4"
assert wrap_text_block(u"文字1\n2345    ",2)==u"文\n字\n1\n23\n45"

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-374023-1-1.html 上篇帖子: 一个生成Python验证码的模块 下篇帖子: python代码规范
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表