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[i]
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"
分享到:
相关推荐
《Python for Data Analysis》是Wes McKinney所著的一本关于数据分析的实用指南,它提供了一系列关于使用Python进行数据处理、分析和探索的工具和方法。此书为数据分析师、数据科学家以及对数据分析感兴趣的Python...
- 源码例程涵盖了大量的实用案例,如文本处理、日期时间操作、数学计算等,为实际编程提供参考。 - 可以通过分析和修改这些例程,提升编程技巧,培养解决问题的能力。 - 实践中还可以学习如何调试程序,查找并...
总结来说,易语言与Python的交互是一种实用的技术,可以让开发者结合两者的优点,构建更强大、更灵活的软件系统。在学习和应用过程中,我们需要关注跨语言通信的效率、稳定性和安全性,同时也需要理解不同语言的特性...
大漠控件中文说明书,对于英语不好的我有很大帮助,有需要的可以下载看看,很实用
OpenCV官方推荐了一些学习资源,如参考手册、网络资源、相关书籍、视频处理和图像处理例程等,这些都是学习和实践OpenCV的宝贵资料。 OpenCV的使用不应止于简单的读写操作,编程者应根据实际需求,深入理解各个模块...
在IT行业中,易语言是一种基于汉语编程的编程环境,它以直观的中文语法设计,使得编程变得更加简单易懂。"吸附窗口模块调用例程"是易语言中一个常见的功能,用于实现窗口与屏幕边界或其他窗口的自动吸附,提供用户...
这种灵活性使得易语言的表在处理复杂数据时具有很高的实用性。 在易语言的表结构中,每个条目都有一个唯一的键(key)与之对应,键可以是字符串或者数字,而对应的值则可以是任意类型的数据。这种设计类似于字典...
7. **汉字显示**:OLED屏幕通过取模技术可以显示汉字,这意味着该项目不仅支持数字和符号,还支持中文字符,增加了显示的灵活性和实用性。 8. **温度传感器**:为了显示环境温度,项目可能整合了一种温度传感器,如...
包括 BGRABitmap,绘图例程。是一款体积小、功能大的图像编辑器。 开源免费绘图软件 LazPaint 中文版开源免费绘图软件 LazPaint 中文版 LazPaint 软件特点 1、支持图层,所以对于大部分人来说易于上手,更加容易的...
3. **交互式终端**:通过串行通信与 OpenMV 模块进行交互,打印输出和接收模块反馈。 使用 OpenMV IDE,首先需要连接 OpenMV 模块。通过 USB 接口连接到电脑后,可以运行代码并更新固件。IDE 提供了官方例程,方便...