Python 正则笔记

By | 2022年7月20日

使用 $ 匹配末尾, Python 用的当前系统换行符

此次笔记来源于工作中遇到一个坑,就是在使用 finditer 对每行开头结尾限定匹配时,用了 $ 匹配字符串的末尾导致的问题,最终代码如下:
def get_policy_hit_cmd(configText):
    cmd = None

    it = re.finditer(r"^config firewall policy\r?$", configText, re.MULTILINE)
    for match in it:
        span = match.span()
        start_index = span[0]
        policyText = configText[start_index:]
        matchstr = configText[span[0]:span[1]]
        # print (match.group())

        it = re.finditer("^end\r?$", policyText, re.MULTILINE)
        for match in it:
            span = match.span()
            end_index = span[1]
            policyText = policyText[0:end_index]

            # 解析 policyId
            policyIds = []
            it = re.finditer("^    edit (\d+)\r?$", policyText, re.MULTILINE)
            for match in it:
                idspan = match.span(1)
                id = match.group(1).strip()
                policyIds.append(id)

            # 输出命令
            ids = ' '.join(policyIds).strip()
            cmd = 'diagnose firewall iprope show 100004 ' + ids
            print cmd
            return cmd

        break

    return cmd
configText 变量是从配置文件中读取的内容, 里面换行都是标准的 \r\n Windows格式,在 windows 上测试没有任何问题,同样的配置拿到 Linux 系统上测试却始终匹配不了。将配置换行全改成 \n Linux 格式后,匹配成功了。因此对于 re.finditer(r"^xxx$", configText, re.MULTILINE) 的匹配,为了兼容 Windows和Linux,可改成 re.finditer(r"^xxx\r?$", configText, re.MULTILINE),即在 $ 前多加个 \r?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注