【Regex】初试Python下的中文正则表达式

0x00 前言

真的是第一次在Python上做正则表达式呀……走了好多弯路,表示自己实在是笨的不行,难得实现了个小Demo,做点备忘好了。
简要概括一下就是:英文正则亲和度蛮高的,随意;中文,转成Unicode再说话!

0x01 参考页面

0x02 正则步骤

  • 转成Unicode
    • 个人是通过decode转成unicode编码来保证编码一致性的,感觉笨笨的,如果有什么好方法希望大神们能务必教教我~ ^_^
  • 拍脑袋自己想个正则表达式
  • 在站长工具之类的地方验证正则效果
  • 非获取(关键
    • (?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如,'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
    • 单单从结论上讲,java可以直接跑通的正则表达式,在python里re.compile(xxx)时,可以试着在每个左括号的右边加上非获取符号(?:
  • 输出的时候随意encode成自己需要的编码

0x03 示例代码

#coding=utf8

import sys
import re, os
import string

Pnumberic    = re.compile(u"[\\d,\\.]+(?:\\d|万|亿)元");
Ppercent     = re.compile(u"[\\d,\\.]+%");
Pzero        = re.compile(u"(?:[^\\d])0(?:[^\\d])");
PDatetime    = re.compile(u"(?:(?:[0-9]{4})[-/\\.年])(?:第[一二三四]季度)?[末初前后]?(?:(?:[01]?[0-9])[-/\\.月])?(?:[0-3]?[0-9]{1}[日])?");

def LR(s):
    return '{'.decode('utf-8') + s + '}'.decode('utf-8')

if __name__ == "__main__" :

    each = u"听说这个公司的净资产为369.38亿元(截至2015年9月30日),然后随便放个12450元呀,2016年7月5日,12.34%和2.5%的百分比什么的试试看。"
    print each
    print 
    if Pnumberic.findall(each):
        #print Pnumberic.search(each).group()
        for pn in Pnumberic.findall(each):
            print pn    
            each = each.replace(pn,LR(pn))
    print 
    if Ppercent.findall(each):
        #print Ppercent.search(each).group()
        for pp in Ppercent.findall(each):
            print pp
            each = each.replace(pp,LR(pp))
    print
    if PDatetime.findall(each):
        #print PDatetime.search(each).group()
        for dt in PDatetime.findall(each):
            print dt
            each = each.replace(dt,LR(dt))
    print
    print each
    # f.write(each.encode('utf-8')+'\n')

输出:

听说这个公司的净资产为369.38亿元(截至2015930日),然后随便放个12450元呀,201675日,12.34%和2.5%的百分比什么的试试看。

369.38亿元
1245012.34%
2.5%

2015930201675日

听说这个公司的净资产为{369.38亿元}(截至{2015930日}),然后随便放个{12450元}呀,{201675日},{12.34%}和{2.5%}的百分比什么的试试看。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖果天王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值