如何使用 Python 匹配字符串中的错误列表
支付阿杰
结论
可以用 any() 逐项检查 matcherror 中的错误信息是否为 errormsg 的子字符串。只要匹配到一项,结果就是 True,后面附带的费用等内容不会影响判断。
另外,matcherror 的元素不应包含多余的 [' 和 ']。它们现在属于字符串的一部分,因此会导致匹配失败。
matcherror = [
"Connection Refused",
"Link Down",
"Agent is not authorized to under pay on a booking."
]
errormsg = (
"Agent is not authorized to under pay on a booking. "
"Total Cost = 10812.00000, Total Payment = 10308"
)
evaluate = any(error in errormsg for error in matcherror)
if evaluate:
send_email(showfailure)
else:
print("No failure for this hour")
在这个例子中,evaluate 是 True,因为第三条错误信息完整出现在 errormsg 中。
为什么不能直接使用 matcherror in errormsg
matcherror 是列表,errormsg 是字符串:
matcherror in errormsg
这个表达式不会自动检查列表里的每个元素。需要遍历 matcherror,分别执行字符串包含判断:
error in errormsg
any() 找到第一个匹配项后会立即返回 True。如果所有项目都不匹配,则返回 False。
获取实际匹配到的错误
如果发送邮件时还需要知道匹配了哪条错误,可以使用 next():
matched_error = next(
(error for error in matcherror if error in errormsg),
None
)
if matched_error is not None:
send_email(showfailure)
print(f"Matched error: {matched_error}")
else:
print("No failure for this hour")
如果没有匹配项,matched_error 就是 None。
忽略大小写
如果错误消息的大小写可能不一致,可以先用 casefold() 统一处理:
matched_error = next(
(
error
for error in matcherror
if error.casefold() in errormsg.casefold()
),
None
)
if matched_error is not None:
send_email(showfailure)
else:
print("No failure for this hour")
对于不区分大小写的文本比较,casefold() 比 lower() 更合适。
如果无法修改原始列表
当前示例中的元素实际是下面这样的字符串:
"['Connection Refused']"
其中的方括号和单引号不是列表语法,而是字符串本身的内容。如果数据来源固定,暂时无法从源头修改,可以先进行清理:
raw_matcherror = [
"['Connection Refused']",
"['Link Down']",
"['Agent is not authorized to under pay on a booking.']"
]
matcherror = [
error.removeprefix("['").removesuffix("']")
for error in raw_matcherror
]
evaluate = any(error in errormsg for error in matcherror)
str.removeprefix() 和 str.removesuffix() 需要 Python 3.9 或更高版本。旧版本可以针对这种固定格式使用切片:
matcherror = [error[2:-2] for error in raw_matcherror]
更稳妥的方式还是直接把列表定义为普通错误字符串,省去匹配时的额外清理。
备注:内容仅供参考。
