在MATLAB中使用正则表达式提取文本数据



我正在处理在METAR(机场天气观测数据(中提取能见度数据的问题。

能见度是一个4位数(0~9(的数据,能见度好时也可以表示为"AVOK"。

但是使用regexp是相当棘手的。(METAR数据有很多变化。(

以下数据样本(MET_VIS(:

201903072300 METAR RKPC 072300Z 17003KT 110V210 CAVOK 05/02 Q1026 NOSIG=
201903062000 METAR RKPC 062000Z 33018G29KT 4000 BR FEW012 SCT025 08/04 Q1018 WS R13 R31 NOSIG=
201903062200 METAR RKPC 062200Z 33015KT 290V350 9999 SCT030 07/03 Q1019 NOSIG=
201903080000 METAR RKPC 080000Z 29002KT CAVOK 08/02 Q1027 NOSIG=

我想在每一行提取CAVOK,40009999,CAVOK。

我试过了,但这个代码不适用于第3行:(它返回空白。

regexp(MET_VIS(i),'((?<=KTs)d{4})|CAVOK','match')

第三个值不以KT结尾。您可以使用另一个正向查找来检查它之前的字符串是否以KT结束,并匹配匹配a-Z0-9的7倍范围,然后在它后面加一个空白字符。

然后使用交替(?:d{4}|CAVOK)匹配4位数字或CAVOK,或者可以在字符串中的任何位置匹配CAVOK。

在其后面添加单词边界,以防止匹配成为较大单词的一部分。

(?:(?<=KTs)|(?<=KT [A-Z0-9]{7}s))(?:d{4}|CAVOK)b

Regex演示

您还可以假设目标应该出现在距离末尾的"单词"范围内。例如:

/b(?:d{4}|CAVOK)b(?=(?: S+){3,9}$)/gm

请参阅regex演示。

在这里,我们只寻找一个四位数的数字或短语CAVOK,如果它后面跟着3到9个可变长度的非空格子串,直到行尾。

最新更新