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
相关产品推荐
相关产品推荐

