You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.9中列表内元组元素被截断的原因及解决方法

正则表达式元组打印/写入文件时被截断的问题排查与解决

我尝试用包含键和正则表达式的元组填充列表,填充后的列表在交互环境显示正常,但打印或写入文件时元组里的正则表达式元素被截断。以下是Python 3.9环境下的测试代码:

# coding: utf-8
import re

regs = []
regs.append(('szerzodes_felmondas',
  re.compile(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|szerzödések|szerzdéssel|szerzödésedet|szerzdésen|szerzödésével|szerzödéseinken|szerzödéssel|szerzödéseket|szerzödést|szerzödéseinek|szerzödéseire|szerzödéseink|szerzödésed|szerzödésein|szerzödésébe|szerzözédeseket)\b',
  re.UNICODE)))

for i in regs:
    if i[0] == 'szerzodes_felmondas':
        print(i)

with open('regs_test.txt','w') as out:
    for i in regs:
        out.write(str(i)+'\n')

问题原因

  • 调用str()处理re.compile()生成的正则表达式对象时,Python默认的__str__方法会截断过长的正则表达式,只显示开头片段,目的是避免输出内容过于冗长。
  • 交互环境中显示的是对象的__repr__结果,其输出逻辑与__str__不同,因此能展示完整的正则表达式内容。

解决方法

方法1:直接获取正则的原始模式字符串

正则表达式对象自带pattern属性,存储了编译时传入的原始正则字符串,直接访问该属性即可得到完整内容:

修改后的代码如下:

# coding: utf-8
import re

regs = []
regs.append(('szerzodes_felmondas',
  re.compile(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|szerzödések|szerzdéssel|szerzödésedet|szerzdésen|szerzödésével|szerzödéseinken|szerzödéssel|szerzödéseket|szerzödést|szerzödéseinek|szerzödéseire|szerzödéseink|szerzödésed|szerzödésein|szerzödésébe|szerzözédeseket)\b',
  re.UNICODE)))

for i in regs:
    if i[0] == 'szerzodes_felmondas':
        # 输出包含完整正则模式的元组
        print((i[0], i[1].pattern))

# 注意指定utf-8编码避免特殊字符乱码
with open('regs_test.txt','w', encoding='utf-8') as out:
    for i in regs:
        # 写入键和完整的正则字符串
        out.write(f"{i[0]}, {i[1].pattern}\n")

方法2:自定义正则对象的字符串表示(可选)

如果需要全局统一正则对象的显示格式,可以包装re.compile的结果,自定义其__str__方法,但这种场景下方法1已经足够简洁实用,一般不需要额外操作。

内容的提问来源于stack exchange,提问作者lmocsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:22:51