使用3.7解码云细节并更多了解Re-解码METAR

时间:2018-11-14 06:16:45

标签: python-3.7

我已经开始越来越多地了解,但在该领域仍然有困难。例如,我能够使用Re:创建这样的模式搜索:

_vis=re.search(r"\s(\d{4})\s((?:\d{4}[NWSE]))?(?:R(\d{2}[LR]?)/(\d{4}[NDU]))?",metar)

我很高兴,但是例如,我无法使用该模式来搜索单词“ CAVOK”。当我尝试使用它时,根本就没有搜索很多短语。我也碰巧找到了一个针对python的METAR类,但是在理解它的工作方式时遇到了问题。这是示例:

WEATHER_RE = re.compile(r"""^(?P<int>(-|\+|VC)*)
                         (?P<desc>(MI|PR|BC|DR|BL|SH|TS|FZ)+)?
                         (?P<prec>(DZ|RA|SN|SG|IC|PL|GR|GS|UP|/)*)
                         (?P<obsc>BR|FG|FU|VA|DU|SA|HZ|PY)?
                         (?P<other>PO|SQ|FC|SS|DS|NSW|/+)?
                         (?P<int2>[-+])?\s+""",
                         re.VERBOSE)
def _handleWeather(self, d):
    """
    Parse a present-weather group.
    The following attributes are set:
        weather    [list of tuples]
        .  intensity     [string]
        .  description   [string]
        .  precipitation [string]
        .  obscuration   [string]
        .  other         [string]
    """
    inteni = d['int']
    if not inteni and d['int2']:
        inteni = d['int2']
    desci = d['desc']
    preci = d['prec']
    obsci = d['obsc']
    otheri = d['other']
    self.weather.append((inteni, desci, preci, obsci, otheri))


handlers = [(WEATHER_RE, _handleWeather, True)]

我做的完全不同,我的代码看起来像是10岁的孩子,但是仍然不了解它是如何工作的。这就是我如何对待云区域。每个词组可能是独立的,您可以像Ive所做的那样猜测后看起来像是红润的,我需要提高它的效率:

_sky_few=re.search(r"(FEW)(\d{3})",metar)
_sky_sct=re.search(r"(SCT)(\d{3})",metar)
_sky_bkn=re.search(r"(BKN)(\d{3})",metar)
_sky_ovc=re.search(r"(OVC)(\d{3})",metar)
_sky_skc=re.search(r"SKC",metar)
_sky_nsc=re.search(r"NSC",metar)
_sky_vv=re.search(r"VV(\d{3})",metar)
_cavok=re.search(r"CAVOK",metar)

在该metar类中,他们是这样完成的:

SKY_RE= re.compile(r"""^(?P<cover>VV|CLR|SKC|SCK|NSC|NCD|BKN|SCT|FEW|[O0]VC|///)
                    (?P<height>[\dO]{2,4}|///)?
                    (?P<cloud>([A-Z][A-Z]+|///))?\s+""",
                    re.VERBOSE)

感谢您的协助。

编辑:

好的,我设法弄懂了一点。我首先以为<>中的东西已经是一个变量了……事实证明并非如此。现在,以一种更简单的方式,我设法执行以下操作:

metar = "METAR XXXX 241100Z VRB20KTG60 9999 FEW020TCU SCT030 BKN060 OVC080 09/M00 Q1005 RMK 090 053 3/3="
SKY_RE= re.compile(r"(?P<cover>FEW|SCT|BKN|OVC|[0]VC|///)(?P<height>[\dO]{3}|///)",re.VERBOSE)
SKY_RE.findall(metar)

我得到以下列表:

[('FEW', '020'), ('SCT', '030'), ('BKN', '060'), ('OVC', '080')]

如何通过一些简单的命令将其转换为变量,之后我可以将其转换为每个列表,然后使用字典进行翻译?这样我就可以拥有2个列表,而无需再次使用正则表达式,而是通过for循环为它回答索引,例如: [FEW,SCT,BKN,OVC] [020,030,060,080]

0 个答案:

没有答案