在 Python 3.9 中,将 re.compile() 生成的正则对象存入元组并放入列表后,直接 print() 或 str() 转换写入文件会导致输出被截断(尤其是长模式),根本原因是 re.Pattern.__repr__ 对长正则字符串做了默认省略处理,并非编码或 Unicode 问题。
在 python 3.9 中,将 `re.compile()` 生成的正则对象存入元组并放入列表后,直接 `print()` 或 `str()` 转换写入文件会导致输出被截断(尤其是长模式),根本原因是 `re.pattern.__repr__` 对长正则字符串做了默认省略处理,并非编码或 unicode 问题。
这种截断行为是 Python 内置的 re.Pattern 类为提升可读性而设计的——当正则模式过长时,__repr__ 方法会自动截断并添加省略号(如 ...)),与文件编码、终端显示或 Unicode 处理无关。你观察到的 szerzödés... 是因错误编码(如用系统默认 cp1252 打开 UTF-8 文件)导致的乱码,但真正的截断发生在 str(re.compile(...)) 这一环节本身。
✅ 正确解决方式:避免依赖 str() 或 repr() 表示正则对象
re.Pattern 实例本身不可序列化为“完整原始字符串”,但你可以显式提取其关键属性:
import re
regs = []
pattern_str = r'\b(szerzödéséről|szerzödást|szerzödésemet|szerzödésést|szerzödéséhez|szerzdés|szerzdésre|szerzödéseddel|szierzödésedet|szerzdésen|szerzödésével|szerzödéseinken|szerzödésébe|szerzözédeseket)\b'
compiled = re.compile(pattern_str, re.UNICODE)
# 存储元组:(key, pattern_string, flags) —— 而非 compiled 对象
regs.append(('szerzodes_felmondas', pattern_str, re.UNICODE))
# 打印完整信息(无截断)
for key, pat_str, flags in regs:
if key == 'szerzodes_felmondas':
print(f"Key: {key}")
print(f"Pattern: {pat_str}")
print(f"Flags: {flags}")✅ 写入文件时确保完整性与可读性
with open('regs_test.txt', 'w', encoding='utf-8') as out:
for key, pat_str, flags in regs:
# 手动构造可读、完整、无截断的文本表示
flag_names = []
if flags & re.UNICODE:
flag_names.append('re.UNICODE')
if flags & re.IGNORECASE:
flag_names.append('re.IGNORECASE')
# ... 其他 flag 可依需补充
out.write(f"{key!r}: re.compile({pat_str!r}, {' | '.join(flag_names) or '0'})\n")? 关键提醒:
python-script-generator下载快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- ❌ 不要对 re.Pattern 对象调用 str() 或 repr() 期望获得完整正则源码;
- ✅ 始终单独保存原始正则字符串(pattern_str)和标志位(flags),这是唯一可靠、可持久化、可调试的方式;
- ✅ 文件操作务必指定 encoding='utf-8',避免 Unicode 乱码(但这不解决截断问题);
- ? 如需运行时重建 re.Pattern,可用 re.compile(pattern_str, flags) 安全还原。
该方法兼顾可读性、可维护性与跨环境一致性,彻底规避 re.Pattern.__repr__ 的内部截断机制。
立即学习“Python免费学习笔记(深入)”;



















