Python 3,7使用Re解码METAR信息



我一直试图将METAR meteo信息代码解码为自由文本,但遇到了问题。我使用refindall函数,然后如果发现任何内容,我将使用字符串索引来获得完全解码的元消息,以分离每个数字并添加特定的单词在中间。

我想知道是否有可能使代码更优雅,而不是将变量类型更改为字符串,然后引用其索引

import re
decoded_metar = ""
metar = "METAR XXXX 241100Z 30020KTG60 240V300 CAVOK 09/M00 Q1005 RMK 090 053 3/3="
wind = ""
wind_dir = re.compile("dddddKT")
wind_speed = re.compile("ddKT")
wind_gusts = re.compile("Gd+")
wind_var = re.compile("d{3}Vd{3}")
_wind_dir = str(wind_dir.findall(metar))
_wind_speed = str(wind_speed.findall(metar))
_wind_gusts = str(wind_gusts.findall(metar))
_wind_var = str(wind_var.findall(metar))
if _wind_dir == "['00000KT']":
wind = "Wind calm. "
else:
if len(_wind_dir) != 0:
wind += "Wind " + _wind_dir[2] + " " + _wind_dir[3] + " " + _wind_dir[4] + " degrees "
if len(_wind_speed) != 0:
wind += "at " + _wind_speed[2] + " " + _wind_speed[3] + " knots. "
if len(_wind_gusts) != 0:
wind += "Gusting " + _wind_gusts[3] + " " + _wind_gusts[4] + " knots. "
if len(_wind_var) != 0:
wind += "Variable between " + _wind_var[2] + " " + _wind_var[3] + " " + _wind_var[4] + " degrees and " + _wind_var[6] + " " + _wind_var[7] + " " + _wind_var[8] + " degrees. "
print(wind)
print("End")

必须使用re.search((。我在代码中详细解释了所使用的正则表达式。还有可供测试的备用输入字符串。

import re
metar = "METAR XXXX 241100Z 30020KTG60 240V300 CAVOK 09/M00 Q1005 RMK 090 053 3/3="
#metar = "METAR XXXX 241100Z 30020KT   240V300 CAVOK 09/M00 Q1005 RMK 090 053 3/3="
#metar = "METAR XXXX 241100Z 30020KT           CAVOK 09/M00 Q1005 RMK 090 053 3/3="
#metar = "METAR XXXX 241100Z 30020KT    CAVOK   240V300  09/M00 Q1005 RMK 090 053 3/3="
# Expected output:
# Wind 3 0 0 degrees at 2 0 knots. Gusting 6 0 knots. Variable between 2 4 0 degrees and 3 0 0 degrees.
mo=re.search(r"(d{3})(d{2})KT(?:G(d+))?(?:.+(d{3})V(d{3}))?",metar)
print(mo.groups())    
_wind_dir, _wind_speed, _wind_gusts, _wind_var_from, _wind_var_to= mo.groups()

def stretch(s):
return " ".join([c for c in s])

wind=""
if int(_wind_dir)==0 and int(_wind_speed)==0:
wind = "Wind calm. "
else:
if int(_wind_dir) != 0:
wind += "Wind " + stretch(_wind_dir) + " degrees "
if int(_wind_speed) != 0:
wind += "at " + stretch(_wind_speed) + " knots. "
if _wind_gusts and int(_wind_gusts) != 0:
wind += "Gusting " + stretch(_wind_gusts) + " knots. "
if _wind_var_from:
wind += "Variable between " + stretch(_wind_var_from) + " degrees and " + stretch(_wind_var_to) + " degrees. "
print(wind+"nEnd")
"""
(d{3})(d{2})KT    This pattern is required.
(d{3}) the 1st group for _wind_dir,
(d{2}) the 2nd group for _wind_speed
(?:G(d+))?         (...G...)? There could be a pattern with 'G' and digits, or not.
(?: ...) The outer group's content is not interesting.
(d+) group for _wind_gusts.
(?:.+(d{3})V(d{3}))?  (...V...)? There could be a pattern with 'V' and digits, or not.
(?: ...) The outer group's content is not interesting.
.+ Some not interesting patterns.
(d{3}) groups for variable values.
"""

最新更新