python3使用正则表达式小记

引言

一个小任务中需要将多个数据段中的最新版本信息提取出来,用到了正则表达式提取数据,有些坑,特此记录。

1.非贪婪匹配和零宽度负回顾后发断言

先看代码

import re
listVersion=[]
fileText='PRS-7000风电场-SZ142372_低压-20170702新版本PRS-7000风电场-SZ142372_低压-150102'
matchV=re.findall(r"((PRS-700U|PRS-7000).+?(?<!SZ)(\d{8}|\d{7}|\d{6}))", fileText, re.MULTILINE)
print(matchV)
for matchVersion in matchV:
    listVersion.append(matchVersion[0])
print(listVersion)

输出:

[('PRS-7000风电场-SZ142372_低压-20170702', 'PRS-7000', '20170702'), ('PRS-7000风电场-SZ142372_低压-150102', 'PRS-7000', '150102')]
['PRS-7000风电场-SZ142372_低压-20170702', 'PRS-7000风电场-SZ142372_低压-150102']
  1. 正则((PRS-700U|PRS-7000).+?(?<!SZ)(\d{8}|\d{7}|\d{6})) 中间的 .+?用到了非贪婪匹配,即懒惰匹配,匹配尽可能少的字符,避免了将两条信息匹配成一条
  2. (?<!SZ)用到了零宽度负回顾后发断言,来断言此位置的前面不能匹配SZ,避免将SZ开头的编号匹配为六位日期。
    当然,日期的正则这里没有更具体,比如判断范围、闰年等。
  3. 如输出结果所示,正则表达式的findall函数以列表形式返回全部能匹配的子串,匹配了所有()分组,遍历取第一个,即最外层()的匹配
  4. re.MULTILINE表示多行匹配

2.文件读写

读文件:

with open(DATA_FILE) as input_file:
    for line in input_file:
        Index, fileName, fileType, creatTime, fileRow, fileText = line.split(';')
        print(Index+','+fileName+','+fileText)
        ...

写文件:

with open(STORED_FILE, 'w') as output_file:
    str_list = [line + '\n' for line in outputText]  # 在list中加入换行符
    output_file.writelines(str_list)

参考

Python3标准库(二) re模块
正则表达式30分钟入门教程

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值