Python re模块正则表达式同时匹配多个条件的最佳实践
需求描述使用socket方法接受数据,每个数据包都是以ZCZC开头,NNNN结尾。每个按照recv(1024)的大小接受数据,会导致有时候收到一个完整的数据包,有时候会收到多个包,而有时候收到残缺的包
需求描述
使用socket方法接受数据,每个数据包都是以ZCZC开头,NNNN结尾。每个按照recv(1024)的大小接受数据,会导致有时候收到一个完整的数据包,有时候会收到多个包,而有时候收到残缺的包。同时,每个包里包含很多个数据项,如TITLE、DRWY、ARWY等等,如何一次性匹配这些数据出来呢?匹配的数据用哪种方式遍历比较好呢?
原始数据如下所示:
ZCZC
-RUNWAY -RWYID 05 -RWYSTATUS ALL
-RUNWAY -RWYID 23 -RWYSTATUS CLS
NNNN
思路分析
匹配模式:
re.compile(r'(^-EXITLANE\s(.*?)$)|(^-ADES\s(.*?)$)|(^-ARWY\s(.*?)$)|(^-DRWY\s(.*?)$)|(^-ADEP\s(.*?)$)|(^-ARCID\s(.*?)$)|(^-STRIPSTA\s(.*?)$)|(^-TITLE\s(.*?)$)|(^-DRWY\s(.*?)$)|(^-TITLE\s(.*?)$)|(^-RUNWAY -RWYID 05 -RWYSTATUS\s(.*?)$)|(^-RUNWAY -RWYID 23 -RWYSTATUS\s(.*?)$)',re.M)
使用re.M按行匹配,开头都是以“-XXXX”起始,然后空格,接着是要匹配的核心数据
最佳迭代:
之前使用最多的是findall方法,以列表形式返回,在此种情况下很不好用,故改用finditer方法,返回的是迭代器,然后调用group()方法直接拿到整行数据。
代码实现
import re
final = ''
with open("402931","r",encoding='utf-8') as f:
final=f.read()
extraction_pattern = re.compile(r'ZCZC\n(.*?)NNNN[\n]?',re.S)
extraction_res = re.findall(extraction_pattern,final)
search = re.compile(r'(^(^-EXITLANE\s(.*?)$)|-ENTRYLANE\s(.*?)$)|(^-ADES\s(.*?)$)|(^-ARWY\s(.*?)$)|(^-DRWY\s(.*?)$)|(^-ADEP\s(.*?)$)|(^-ARCID\s(.*?)$)|(^-STRIPSTA\s(.*?)$)|(^-TITLE\s(.*?)$)|(^-DRWY\s(.*?)$)|(^-TITLE\s(.*?)$)|(^-RUNWAY -RWYID 05 -RWYSTATUS\s(.*?)$)|(^-RUNWAY -RWYID 23 -RWYSTATUS\s(.*?)$)',re.M)
for item in extraction_res:
res = re.finditer(search,item)
for i in res:
line = i.group()
new = line.rsplit(" ",1)
print(new)
相关文章
- okhttp使用post方式发送form-data数据
- JAVA字符串逗号分隔并对每个字符串添加引号
- [Docker系列] Install BaoTa with Docker
- [信创系列]银河麒麟安装nodejs18和npm2,并启动对应工程
- EasyExcel导出Excel并合并单元格
- Python3安装pip及pip安装whl包
- [Ubuntu系列]Ubuntu 安装 Harbor
- [Ubuntu系列]Ubuntu 安装 docker 及修改 docker 存储位置
- [Centos系列]CentOS 修改 DNS
- [Centos系列]source /etc/profile 无法永久生效问题
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~