python 匹配文本全角转半角字符「建议收藏」

python 匹配文本全角转半角字符「建议收藏」在对文本进行处理的时候经常会遇见要对括号和标点进行匹配常见的英文(半角)符号如()直接用正则匹配即可但是遇见全角字符(中文括号、标点),直接用正则匹配会存在问题:因为编码通常为为utf8,若直接匹配,中文括号的3字节编码会和一些中文的字节编码重复,产生意想不到的结果若用decode转为unicode编码,则可避免产生错误结果,但也无法直接用正则匹配到经过试验,发现一个看上去

大家好,又见面了,我是你们的朋友全栈君。

在对文本进行处理的时候经常会遇见要对括号和标点进行匹配

常见的英文(半角)符号如( ) 直接用正则匹配即可

但是遇见全角字符(中文括号、标点),直接用正则匹配会存在问题:

因为编码通常为为utf8,若直接匹配,中文括号的3字节编码会和一些中文的字节编码重复,产生意想不到的结果

若用decode转为unicode编码,则可避免产生错误结果,但也无法直接用正则匹配到

经过试验,发现一个看上去最佳的解决方法:

将字符串decode之后调用一个将全角符号转为半角符号的方法,然后处理返回的字符串

def strQ2B(ustring):    """全角转半角"""    rstring = ""    for uchar in ustring:        inside_code=ord(uchar)        if inside_code == 12288:                              #全角空格直接转换            inside_code = 32        elif (inside_code >= 65281 and inside_code <= 65374): #全角字符(除空格)根据关系转化            inside_code -= 65248        rstring += unichr(inside_code)    return rstringdef p(s):    s1 = strQ2B(s.decode())    p = re.compile('[()]',re.S)    s1 = p.sub('',s1)    return s1

这种方法本质上就是将正则的pattern字符和目标的编码对应, 所以将正则的字符串也用unicode表示就好可以:如下

#!/usr/bin/env python#-*- coding: utf-8 -*-import sysreload(sys)sys.setdefaultencoding('utf8')import reif __name__ == '__main__':    s = '123(45)a啊速度(伤害)有限公司'    ss = re.sub(u'[()()]', '', s.decode())    print ss

总的来说 两种方法都还是有必要存在的。

第二种方法简单直接 如果能快速方便列出所有形式的待匹配符号,就果断选用第二个

反之,若待匹配的各种符号太多太繁琐,就统一转为半角再处理更好

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159998.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月15日 下午11:16
下一篇 2022年7月15日 下午11:36


相关推荐

  • java heap space 什么意思_Java heap space 解决方法(转)

    java heap space 什么意思_Java heap space 解决方法(转)因为程序要从数据读取近10W行记录处理,当读到9W的时候就出现java.lang.OutOfMemoryError:Javaheapspace这样的错误。在网上一查可能是JAVA的堆栈设置太小的原因。跟据网上的答案大致有这两种解决方法:1、设置环境变量setJAVA_OPTS=-Xms32m-Xmx512m可以根据自己机器的内存进行更改,但本人测试这种方法并没有解决问题。可能是还有…

    2022年7月14日
    27
  • 作为Java开发,你一定要了解面向对象编程中为什么要使用get和set方法

    一、由一个问题开始在进行面向对象开发中,在编写一个Class的时候,会定义这个Class的属性(字段)为Private,然后去生成对应的get和set方法,通过这样的方式去对属性进行操作,那你有没有思考过为什么要这样做呢?这样做有哪些好处呢?请先自行思考30秒,在看下面的内容。二、回顾相关知识回答这个问题之前,让我们先回顾一些的基础知识:1、访问修饰符,从访问的范围由小及大依次是:pri…

    2022年2月27日
    47
  • ubuntu下30天自制操作系统还在继续学习中

    ubuntu下30天自制操作系统还在继续学习中

    2021年12月1日
    43
  • Unity 实现两个向量夹角为0~360度

    Unity 实现两个向量夹角为0~360度实现向量夹角为 0 360

    2026年3月26日
    2
  • 总线带宽 – 计算

    总线带宽 – 计算计算步骤 1 个时钟周期 1 总线时钟频率 总线传输周期 1 个时钟周期 总线周期包含时钟周期个数 总线带宽 每个总线周期传送的数据 总线传输周期 单位转化 1MHz 1 s Byte 字节 可缩写成 B 大写 Bit 比特 可缩写成 b 小写 1B 8b 1MB 1 000 000 10 6 B 1s 1 000 000

    2026年3月26日
    2
  • js在数组指定位置添加元素_java数组删除指定位置元素

    js在数组指定位置添加元素_java数组删除指定位置元素原文链接:Array:InsertanItemataSpecificIndexwithJavaScript原文日期:2014年07月24日翻译日期:2014年07月26日翻译人员:铁锚很多与数组有关的任务听起来很简单,但实际情况并不总是如此,而开发人员在很多时候也用不到他。最近我碰到了这样一个需求:将一个元素插入到现有数组的特定索引处。听起来很容易和常见,但需要一点时间

    2022年8月11日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号