基于Python正则表达式的航空气象观测报文检测

2017-11-20 13:21李灿
电脑知识与技术 2017年25期

李灿

摘要:该文提出了一种不同于传统的防止报文错误的思路,使用以python语言与正则表达式模块对报文进行格式错误与逻辑错误检测:首先使用正则表达式对报文进行分割、验证,接着运用脚本语言动态进行逻辑判断,识别报文是否正确。

关键词:航空气象;观测报文; Python 正则表达式

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2017)25-0227-03

1 概述

航空安全关系着千家万户,民航安全的基石依靠每一个民航人点滴微小工作。民航气象观测报文的用户群巨大,有空中管制员、航空公司、普通旅客,所以国家对观测报文的准确率要求也越来越高。但与实际情况矛盾的是现在的报文编辑软件少有错误控制。由于现在的编报软件本地化程度都不高,所以在编报过程进行逻辑纠错在现阶段很难实现。所以本文直接从报文入手,对已经编辑成型的报文进行逻辑与格式检查。

2 Python与正则表达式

Python是一种简单易学功能强大的脚本语言。虽然是脚本语言,她有着强大丰富的库,能嵌入任何c\c++编写的程序,也可以用c\c++编写拓展模块,而且与C#和JAVA一样完全面向对象,更重要的她天生就是处理字符串的好手,其在检验报文逻辑时起了至关重要的作用。

正则表达式(Regular expression)是仿生学的产物,其源于神经学,然后经过数学家与计算机学家的理论证明才产生正则表达式。它通过编写“模式(Pattern)”——可以理解为一种文本模板、格式模板,来匹配及获取目标字符串中的对应内容。现代的正则表达式主要是分为DFA(确定型有穷自动机)和NFA(非确定型有穷自动机)两类引擎[1]。就其工作原理而言,它们是通过完全相反的方式来匹配字符串,DFA拥有效率高、速度快、结果一致,而NFA则拥有许多有意思而强大的特性,如回溯、反向應用、环视等等。Python的正则表达式模块是基于后者。因为NFA引擎的原理和特性,Python及其正则表达式在大多数情况都是利用与字符串的处理,在数据挖掘以及人工智能都有着极其重要的地位。例如,胡军伟等[2]运用正则表达式对 Web 信息抽取,娄宝翠等[3]正则表达式与文本处理技术应用,唐勇等[4]运用正则表达式对蠕虫特征进行自动提取。正则表达式的运用可以说是方方面面,但是在航空报文检测方面这是一片空白。

3 关于航空气象报文错误类型分析

航空气象报文分为观测报文和预报报文,我们在这里进行采用观测报文进行详细阐述。要检验报文的正误性,就必须了解报文会有哪些错误类型。报文的错误类型主要分两大类。第一类为格式错误,主要包括有字面错误、字符串顺序错误、字符多余或缺失错误。这类型错误,只需要判断正则表达式能否匹配就能判断出来。第二类为逻辑错误,主要包括有数据增量错误、数据溢出错误、条件错误。这类型错误,一般涉及多个要素的组合判断,在正则表达式匹配正确之后,还需要经过多个条件分支进行逻辑判断,才能判断出正误。

4 航空气象报文检测

我们先从宏观的角度来考虑如何解决这个问题。我们需要这样一个程序:输入一条报文,经过这个程序的检测,如果通过就输出“0”,反之则输出错误代码,通过错误代码我们即可以找到报文错误位置。这个程序的主要过程如下:

首先是格式错误的识别。这种错误更倾向于使用模式来识别,因为其有效率高、速度快、易修改、简单明了等特点。只要模式匹配到字符串,就说明三类细分错误的检测都通过,所以如何编写模式就成了关键,这是整个检验程序的基点,也是难点。经过反复测试我们总结出了以下报文匹配模式。

与格式错误相对应的是逻辑错误。在进行逻辑判断之前,需要将各个部分分组进而提取要素。根据国际民航公约附录三规定(Annex 3to the Convention onInternational Civil Aviation)下称“公约”,观测报文包括报头、机场代码、时间、风、能见度、跑道视程、天气现象、云、温度、湿度、气压、附加信息共计12个项目。在面对如此多项目的情况下,该如何正确的分组?我们在这里考虑两点:1)分组匹配是否唯一;2)尽可能将相关的要素放在一个分组内。要解决唯一性需要分组内至少有一个有且只有一个的字符在分组内,即“关键词符”。例如温度露点组M?\d{2}/M?\d{2}\s+中反斜杠就是关键词符。依照条件,我们做出了如表2的分组。

分组成功以后,需要对报文中的风向、风速、能见度等要素进行提取。要素提取大体思路一致:利用正则表达式括号的其中一个性质——数据捕获。举个例子,在第二组WIND中分组的匹配模式是(VRB|\d{3})P?\d{2}(GP?\d{2})?MPS\s+(\d{3}V\d{3}\s+)?,我们需要捕捉其中的风向、风速、大风、风向变化范围。于是我们给这些要素加上括号,已经有的则不需要,变成了(VRB|\d{3})(P?\d{2})(?:G(P?\d{2}))?MPS\s+(?:(\d{3})V(\d{3})\s+)?。值得注意的,原模式本身就存在一些其他用途的括号,而括号内的数据可能并不是我们所需要的,我们就可以在左括号后加上“?:”,这样就不会被捕捉到[5]。

逻辑错误不同于格式错误,因为正则表达式不能进行逻辑判断,所以这就需要用到python语句来弥补。逻辑判断分为数据增量错误、数据溢出错误和条件错误:

1) 数据溢出错误包括时间、风向风速、阵风、云高、温度露点和修正海压。其中后三项是需要输入本站要素合理范围。其他三项只需要使用条件语句也可以轻松判断,限于篇幅这里就不做详述。

[2)]增量错误主要是针对风向、能见度和RVR的。报文中的风向都是以10度为一个增量的,所以风向的判断比较简单。只需要要将风向与10做取膜运算,得数不为零则返回错误。能见度与RVR的判断就相对来说比较复杂,其源于他们的增量是呈阶梯式的,增量会随着数值的增大而增大。在程序里用逻辑解决该阶梯函数时,与风向类似,将数值与区间内对应增量取膜,结果不为零则返回错误。endprint

3) 条件错误的检查是整个程序的重点,不仅是因为这部分代码占总行速的百分之七十以上,更重要的是要将这么多规则条理清晰的摆放在一起并不是一件简单的事情。理清思路,条件错误的检查其实就是将法律法规的文字转换成另外一种程序文字表达,让计算机能自动化检测正误。编报规程十分繁杂,限于篇幅,不可能面面俱到,所以以下我们三个较典型的部分进行说明。

现在天气的检查。这部分需要检查的有三类天气:与CB或TCU云组相关的天气;与风相关的天气;与能见度相关的天气。第一类有两种天气:含FZ和含TS的天气。第二类只有飑线是需要检测风速的。这两类都是先采用正则表达式将判断其是否存在,若是,则继续判断相关的要素是否符合规则。第三类的天气较前两类都多,而且每一种天气的能见度都不尽相同。这类判断思路如下:首先用正则表达式匹配出N(≥0)种该类天气,判断报文中的能见度是否在该天气现象对应能见度区间内。现在天气检验还有一点容易让人忽略的地方是,天气现象的编报是有前后顺序的。这也是需要用逻辑算法判断的。

RVR变化范围检测。先来看一条公约中规则“某一分钟的平均极值与10分钟的平均值变化超过50或20%时(两者取其大),则需要编辑RVR的变化范围。”[7]我们可以从这条RVR编报规则中得到检测规则。由于我们在报文中只能得到RVR的极值,所以可以假设RVR的平均值与RVR极小值相等(记为RVRmin,这里我们也可以假设与极大值RVRmax相等),上面这条规则这可变为以下公式:

[RVRmax>RVRmin+50, RVRmin≤250RVRmax>(1+20%)*RVRmin, RVRmin≥250]

可以看出这是个分段函数,只有当两个极值满足于上面的公式时,才能编RVR变化范围(图2灰色部分)。

云组的检测。云组检测主要是云量的检测比较复杂。因为云量涉及一项所谓“135规定”:第一层云云量必须是大于一;第二层云云量必须是大于三;第三层云量必须是大于五[7]。看似简单的规定,但因为同高云与CB(TCU)的存在,使得编报起来就比较复杂了。解决方法可以通过以下判断实现:判断当前云块是否符合“135规定”;判断是否为CB(TCU);是否与前层云同高。如图3所示。

5 函数实践检验

检验数据:2010年1月到2015年10月湛江观测室发送电码格式报文(包括SPECI与METAR报),一共是六万三千分报。为了达到测试的目的,我们将随机挑选6个报文修改其中的要素,使其报文错误,每份报文修改不同的要素。测试结果如表3:

结果分析: 6个修改报文全数找出;云错误达到1500份之多,这是因为以前用SKC而现在不在使用;遍历所有报文所需平均时间为5.23秒,平均到每一份报上,这个数字是微秒级别的。

6 改进与总结

经过上面的测试,我们对整个函数的查错效果还是十分满意。Python与其正则表达式模块无论是在代码的健壮性、可修改性、还是工作效率上的表现都可圈可点。而函数的工作速度,差错率也是令人满意的。但是这个函数在查找多份报文联结错误时,却不能有效的工作。所以在后续的工作中,我们会继续完善有关特殊天气报告方面的模块,使其能判断多份报文之间的关系,使之能更好地为空管气象事业做出贡献。

参考文献:

[1] (美)佛瑞德著.精通正则表达式第3版[M].北京:电子工业出版社,2012.

[2] 唐勇,诸葛建伟,陈曙晖,卢锡城. 蠕虫正则表达式特征自动提取技术研究[J]. 通信学报,2013(3):141-147.

[3] 娄宝翠. 正则表达式与文本处理技术应用[J]. 河南师范大学学报:哲学社会科学版,2012(3):240-242.

[4] 胡军伟,秦奕青,张伟. 正则表达式在Web信息抽取中的应用[J]. 北京信息科技大学学报:自然科学版,2011(6):86-89.

[5] (美)马特利,(美)阿舍尔,等.Python Cookbook 中文版[M].北京:人民邮电出版社,2010.

[6] MH/T 4016.6-2007民用航空氣象第六部分:电码.

[7] AP-117-TM-02R1民用航空气象地面观测规范.endprint