`
fangzhouxing
  • 浏览: 213358 次
  • 性别: 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例程 (1).rar_Python 例程_python_python例程

    在这个"python例程 (1).rar"压缩包中,我们很显然会发现一系列关于Python编程的基础教程和实例,特别关注了图形界面编辑和各种Python库的使用。 首先,让我们探讨Python语言基础。Python的基础语句包括但不限于变量...

    大疆机甲大师Python例程.zip

    使用中文命名的大疆机甲大师Python例程 使用中文命名的大疆机甲大师Python例程 使用中文命名的大疆机甲大师Python例程 使用中文命名的大疆机甲大师Python例程 使用中文命名的大疆机甲大师Python例程 使用中文命名的...

    python编程例程

    "python编程例程"这个资源包显然是为那些希望学习或巩固Python基础知识的人准备的。它包含了大量的Python基础PDF文档,提供了丰富的学习材料。 首先,我们要理解Python的基础概念。Python是一种高级、解释型、交互...

    易语言调用python3.6例程

    (如本人本机python36.dll在D:\program files (x86)\Microsoft Visual Studio\Shared\Python36_86目录下)。3,测试时将zip压缩包全部解压到同一目录下。4,若有时间可封装支持库。资源作者:。@cs666。资源下载:。

    python入门例程

    "Python入门例程"这个标题表明这是一个针对初学者设计的教程,旨在帮助刚刚接触Python的人快速掌握基本概念和编程技巧。 在描述中提到,这个资料是“入门级别的python代码”,这意味着它将涵盖Python的基础知识,...

    易语言调用Python源码例程

    本文将深入探讨如何使用易语言调用Python源码,并通过具体的例程来阐述这一过程。 首先,确保你已经安装了Python环境,包括Python解释器和PythonW(无界面版本)。PythonW用于避免在调用Python脚本时出现控制台窗口...

    Python简明教程例程.zip

    "Python简明教程例程.zip"这个压缩包很可能是为了帮助初学者快速掌握Python编程基础而设计的一系列教学实例。通过解压并学习这些例程,你可以深入理解Python的核心概念,包括变量、数据类型、控制流、函数、模块、类...

    Python例程1.2-入门

    Python例程1.2-入门(conditionals,exceptions,for loop,function, generator, simple loop, while loop, error info)-Python examples 1.2-Quick Start(conditionals,exceptions,for loop,function, ...

    Python3例程

    用Python3编写的,采用递归调用技术实现查找指定磁盘路径范围内包含给定字符串的文本文件功能的例程

    常见数据结构的 Python 代码例程

    常见数据结构的 Python 代码例程

    qt调用python脚本例程.rar

    这个“qt调用python脚本例程.rar”压缩包文件提供了一个示例,展示了如何在Qt(一个跨平台的C++图形用户界面应用程序框架)中调用Python脚本来扩展功能或利用Python的丰富库资源。以下将详细解释这个集成过程的关键...

    VC++实用例程的精品源码

    总之,这个VC++实用例程集合提供了一个宝贵的资源,涵盖了图像处理、文件操作、网络通信和邮件发送等多个方面,对于想要提升VC++编程技能,尤其是涉及到这些特定功能的开发者来说,是一份极其有价值的参考资料。...

    argis资源基于ArcGIS的Python编程例程

    argis资源基于ArcGIS的Python编程例程

    pygame.rar_P91_Pygame_Python 例程_pygame联合qt_python 游戏

    pygame的实用例程,实现了几个用python开发的小游戏

    VC程序与Python双向交互例程

    本文将深入探讨“VC程序与Python双向交互”的实现方式,以标题为"VC程序与Python双向交互例程"的示例,讲解如何在C++(Visual C++,简称VC)环境中构建一个能够与Python脚本进行通信的应用程序,以及如何通过动态...

    labview超实用例程

    通过"labview超实用例程"的学习,你将逐步掌握LabVIEW的编程技巧,包括错误处理、调试技巧、性能优化等,最终能够独立设计和实现复杂的测试和控制系统。每个例程都是一个实践机会,通过实际操作,你可以加深对...

    Python例程

    这是一段来自美国加州大学尔湾分校教授的一段Python教学例程

    Python入门例程

    本文将深入探讨Python编程的基本概念,结合"Python入门例程"和"Python简明教程例程"中的实例,帮助您快速上手。 ### 1. Python环境搭建 首先,你需要安装Python解释器,可以从官网下载最新版本(如Python 3.x)。...

    C++调用PYthon脚本(例程)

    本资源“C++调用Python脚本(例程)”提供了一个完整的工程实例,演示了如何在C++程序中动态地调用Python脚本,使得C++能够利用Python的灵活性和便利性。 在C++中调用Python脚本主要有两种方法:一种是通过Python的...

    python技术篇指导_python例程_

    在Python技术领域,编写例程是学习和理解编程概念的关键步骤。Python因其简洁明了的语法和丰富的库支持,成为了初学者和专业人士的首选语言。本篇指导将深入探讨Python编程的一些基本要素,通过实例来阐述如何编写...

Global site tag (gtag.js) - Google Analytics