`
fangzhouxing
  • 浏览: 214151 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

与汉字处理有关的Python实用例程

阅读更多

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(pdf)

    《Python for Data Analysis》是Wes McKinney所著的一本关于数据分析的实用指南,它提供了一系列关于使用Python进行数据处理、分析和探索的工具和方法。此书为数据分析师、数据科学家以及对数据分析感兴趣的Python...

    易语言源码例程200个例

    - 源码例程涵盖了大量的实用案例,如文本处理、日期时间操作、数学计算等,为实际编程提供参考。 - 可以通过分析和修改这些例程,提升编程技巧,培养解决问题的能力。 - 实践中还可以学习如何调试程序,查找并...

    易语言-易语言与python交互

    总结来说,易语言与Python的交互是一种实用的技术,可以让开发者结合两者的优点,构建更强大、更灵活的软件系统。在学习和应用过程中,我们需要关注跨语言通信的效率、稳定性和安全性,同时也需要理解不同语言的特性...

    大漠接口中文版说明

    大漠控件中文说明书,对于英语不好的我有很大帮助,有需要的可以下载看看,很实用

    OpenCV中文参考手册2010年.pdf

    OpenCV官方推荐了一些学习资源,如参考手册、网络资源、相关书籍、视频处理和图像处理例程等,这些都是学习和实践OpenCV的宝贵资料。 OpenCV的使用不应止于简单的读写操作,编程者应根据实际需求,深入理解各个模块...

    吸附窗口模块调用例程-易语言

    在IT行业中,易语言是一种基于汉语编程的编程环境,它以直观的中文语法设计,使得编程变得更加简单易懂。"吸附窗口模块调用例程"是易语言中一个常见的功能,用于实现窗口与屏幕边界或其他窗口的自动吸附,提供用户...

    e语言-易语言可以存储任意类型数据的表

    这种灵活性使得易语言的表在处理复杂数据时具有很高的实用性。 在易语言的表结构中,每个条目都有一个唯一的键(key)与之对应,键可以是字符串或者数字,而对应的值则可以是任意类型的数据。这种设计类似于字典...

    参考程序-电池采集电量显示---迷你OLED时钟资料V3.2.rar

    7. **汉字显示**:OLED屏幕通过取模技术可以显示汉字,这意味着该项目不仅支持数字和符号,还支持中文字符,增加了显示的灵活性和实用性。 8. **温度传感器**:为了显示环境温度,项目可能整合了一种温度传感器,如...

    绘图软件 LazPaint 7.1.6 + x64 中文多语免费版.zip

    包括 BGRABitmap,绘图例程。是一款体积小、功能大的图像编辑器。 开源免费绘图软件 LazPaint 中文版开源免费绘图软件 LazPaint 中文版 LazPaint 软件特点 1、支持图层,所以对于大部分人来说易于上手,更加容易的...

    OpenMV零基础教程

    3. **交互式终端**:通过串行通信与 OpenMV 模块进行交互,打印输出和接收模块反馈。 使用 OpenMV IDE,首先需要连接 OpenMV 模块。通过 USB 接口连接到电脑后,可以运行代码并更新固件。IDE 提供了官方例程,方便...

Global site tag (gtag.js) - Google Analytics