博客太久没更新了,是要拔拔草。最近刚好在比较深入的学字符串正则化匹配的内容,顺便完成一个小作品。就是解析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