使用 $ 匹配末尾, 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?。