PAYATHON 2026

如何使用 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]

更稳妥的方式还是直接把列表定义为普通错误字符串,省去匹配时的额外清理。

备注:内容仅供参考。