
本文介绍如何使用 Python 正则表达式从邮件正文(text/plain)中精准提取 BOT ID,并将 re.findall() 返回的元组列表转换为原始连字符分隔的字符串格式(如 4824CF8B-2986-11EC-80F0-84A93851B964),同时兼顾单匹配与多匹配场景。
本文介绍如何使用 python 正则表达式从邮件正文(text/plain)中精准提取 bot id,并将 `re.findall()` 返回的元组列表转换为原始连字符分隔的字符串格式(如 `4824cf8b-2986-11ec-80f0-84a93851b964`),同时兼顾单匹配与多匹配场景。
在通过 IMAP 解析邮件内容时,常需从纯文本邮件体(text/plain)中提取结构化标识符,例如形如 "BOT ID: 4824CF8B-2986-11EC-80F0-84A93851B964" 的 UUID 风格字符串。你已正确使用正则表达式捕获各段:
import re
ID_pattern = r"BOT ID: (\w+)-(\w+)-(\w+)-(\w+)-(\w+)"
machine_id = re.findall(ID_pattern, body) # 返回 [('<part1>', '<part2>', ..., '<part5>')]</part5></part2></part1>
但 re.findall() 对含多个捕获组的模式会返回元组列表(如 [('4824CF8B', '2986', '11EC', '80F0', '84A93851B964')]),而非拼接后的完整字符串。要还原为原始格式,关键在于对每个元组执行 "-".join() 操作。
✅ 单匹配场景(推荐用于确定唯一 BOT ID):
直接取首项并拼接:
if machine_id: # 确保匹配成功
bot_id = "-".join(machine_id[0])
print(bot_id) # 输出:4824CF8B-2986-11EC-80F0-84A93851B964
else:
bot_id = None # 或抛出异常/记录日志
✅ 多匹配场景(如一封邮件含多个 BOT ID):
使用列表推导式批量处理:
bot_ids = ["-".join(parts) for parts in machine_id] # bot_ids 示例:['4824CF8B-2986-11EC-80F0-84A93851B964', 'ABCD1234-5678-90AB-CDEF-1234567890AB']
⚠️ 注意事项:
- 正则模式
(\w+)可匹配字母、数字和下划线,但 UUID 标准仅含十六进制字符(0–9, a–f, A–F)和连字符。更严谨的写法应为:ID_pattern = r"BOT ID: ([0-9a-fA-F]{8})-([0-9a-fA-F]{4})-([0-9a-fA-F]{4})-([0-9a-fA-F]{4})-([0-9a-fA-F]{12})"这能避免误匹配非 UUID 字符串(如含
_或g-z)。 - 始终检查
machine_id是否为空,防止IndexError;建议结合re.search()获取首个匹配(返回Match对象)或re.finditer()流式处理。 - 若邮件体含 HTML 或编码(如 quoted-printable),需先解码再正则匹配,否则可能漏匹配。
综上,核心逻辑简洁而健壮:用 "-".join(tuple) 还原分段字符串,辅以边界检查与正则精修,即可稳定提取符合规范的 BOT ID。










