Python正则re.escape使用报错TypeError: 第一个参数必须为字符串或已编译模式
报错原因
你定义pattern变量时,在字符串末尾多写了一个英文逗号,,Python会自动将该变量识别为存储了字符串的元组,而非re.findall要求的字符串/已编译正则对象,因此触发类型错误。
修复方案
除了修正语法错误外,还需要调整正则标识和匹配规则,才能实现多行文本匹配需求:
- 删掉
pattern定义末尾的逗号,修正语法问题 - 替换
re.MULTILINE标识为re.DOTALL:re.MULTILINE的作用是控制^、$匹配单行的首尾,而你需要让.支持匹配换行符,必须开启re.DOTALL标识 - 把贪婪匹配
.*改为非贪婪匹配.*?,避免日志中存在多个Traceback块时,匹配范围横跨多个独立错误栈的问题
完整可运行的实现代码如下:
import re # 可自行替换首尾匹配的固定字符串 start_text = "Traceback (most recent call last):" end_text = "botocore.exceptions.ClientError: An error occurred (ExpiredToken) when calling the PutObject operation: The provided token has expired." # 转义特殊字符后拼接正则,非贪婪匹配中间内容 pattern = rf"{re.escape(start_text)}(.*?){re.escape(end_text)}" # 开启DOTALL支持跨行匹配,your_log_text替换为你的日志文本变量 match_results = re.findall(pattern, your_log_text, flags=re.DOTALL)
如果需要匹配结果同时包含首尾的固定字符串,只需调整正则的捕获组范围即可:
pattern = rf"({re.escape(start_text)}.*?{re.escape(end_text)})"
内容的提问来源于stack exchange,提问作者user1315621
相关产品推荐
相关产品推荐

