练一练正则化匹配,实现将解析CPM报,并生成固定格式CPM报文

本文介绍了一个用正则表达式解析和处理CPM(Container Pallet Message)报文的实践案例,包括代码展示、原始CPM报文内容以及通过异常处理实现Python命令行多行输入的支持。
摘要由CSDN通过智能技术生成

博客太久没更新了,是要拔拔草。最近刚好在比较深入的学字符串正则化匹配的内容,顺便完成一个小作品。就是解析CPM报文的功能。(CPM is short for Container Pallet Message)。

一、好了,照样话不多说,贴上代码

# -*- coding=utf-8 -*-
# using python 3
# Author: Sysuzzd
# Under Project: HS ON ML WITH SCIKIT AND TENSORFLOW
# @Time : 2019-6-29  22:35


# *******************************************   Purpose & Illustration   ***********************************************
# 解析CPM报,并生成标准格式CPM
# **********************************************************************************************************************

import sys, os
import re

def cpm_nor():
    # 定义cpm文件地址
    cpm_file_route = r'D:\ZeDongPythonLearn\HS ON ML WITH SCIKIT AND TENSORFLOW\Hands-On.Machine.Learning.with.Scikit-Learn.and.TensorFlow.2017\handson-ml-master\CPM4.txt'
    with open(cpm_file_route, 'r') as cpm_file:
        cpm_str = cpm_file.read()
    # print(type(cpm_str))   # out:  <class 'str'>

    # 定义777-200F机型cpm各货舱集装器正则匹配
    flight_pattern = r'\w{2}\d{3,4}\/\d{2}\w{3}\d{2}\.\w\d{4}.+\w{3}\n'   # 定义航班信息模式
    flight_info = re.findall(flight_pattern, cpm_str)[0][:-1]
    # print(flight_info)

    maindeck_left_pattern = r'(MAIN\sDECK\sLEFT\sSIDE.*)\n.+DECK\sRIGHT'
    maindeck_left_str = re.findall(maindeck_left_pattern, cpm_str, re.S | re.M)[0]  # class list  re.S 代表 . 可以代表任何字符,包括换行符   re.M 表示^ 和$ 是每行的开头结束
    # print(maindeck_left_str)
    # print(re.split(r'\n', maindeck_left_str))
    # print(r'-R/' in maindeck_left_str)

    # maindeck_right_pattern = r'(MAIN\sDECK\sRIGHT\sSIDE.*)\n.+LOWER\sDECK'    # 这是错误的正则匹配,会导致少掉PR位置
    maindeck_right_pattern = r'(MAIN\sDECK\sRIGHT\sSIDE.*)\nLOWER\sDECK'
    maindeck_right_str = re.findall(maindeck_right_pattern, cpm_str, re.S | re.M)[0]
    # print('check', maindeck_right_str)

    lowerdeck_pattern = r'(LOWER\sDECK.*)\nBULK'
    lowerdeck_str = re.findall(lowerdeck_pattern, cpm_str, re.S | re.M)[0]
    while 'BULK' in lowerdeck_str:
        lowerdeck_str = re.findall(r'(.*?)\nBULK', lowerdeck_str, re.S)[0]
    # print(lowerdeck_str)

    bulk_pattern = r'(BULK.*\nBULK?.*)\n'
    bulk_str = re.findall(bulk_pattern, cpm_str, re.M)[0]
    # print(bulk_str)
    # print(re.split(r'\n', bulk_str))

    main_left, main_right, main_center = check_main_center(maindeck_left_str, maindeck_right_str)
    # print(main_center)
    # print(main_left)
    # print(main_right)
    lower, lower_left, lower_right = check_lower_sides(lowerdeck_str)
    # print('检查' , lower_left)
    # print('检查' , re.split(r'\n', '\n'+lower_left)[1:])
    # print(lower)

    # 定义集装器字典
    # print('check' , lower_left)
    # print(lower_left == '\n')
    flight_cpm 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值