finditer()似乎有些问题,我一直在使用finditer()在一行中搜索一个模式,我需要维护它们的收集顺序,以下是我的代码,
names = collections.OrderedDict()
line1 = 'XPAC3出口$<zho>$ASDSA1出口$<chn>$ExitA2$<eng>$YUTY1出口$<fre>'
names = {n.group(2):n.group(1) for n in re.finditer("\$?(.*?)\$<(.*?)>", line1, re.UNICODE)}
然后我打印出来,
for key, value in names.iteritems():
print key, ' ',value
输出结果是
fre YUTY1出口
ASDSA1出口
zho XPAC3出口
eng ExitA2
但我需要以下顺序,
zho XPAC3出口
ASDSA1出口
eng ExitA2
fre YUTY1出口
如何继续?我是否需要更改正则表达式或使用finditer()以外的其他内容
答案 0 :(得分:3)
当你说
时names = {...}
您正在删除对空OrderedDict
的引用(将进行垃圾回收)并将names
重新绑定到常规dict
(当然无序)
您应该将匹配传递给OrderedDict的构造函数
names = collections.OrderedDict((n.group(2), n.group(1)) for n in re.finditer("\$?(.*?)\$<(.*?)>", line1, re.UNICODE))
答案 1 :(得分:3)
您使用字典理解重写名称字典,而常规字典不保留插入顺序。要保留订单返回列表并将其提供给OrderedDict
,请执行以下操作:
import collection
import re
line1 = 'XPAC3出口$<zho>$ASDSA1出口$<chn>$ExitA2$<eng>$YUTY1出口$<fre>'
names = [(n.group(2), n.group(1)) for n in re.finditer("\$?(.*?)\$<(.*?)>", line1, re.UNICODE)]
names = collections.OrderedDict(names)
for key, value in names.iteritems():
print key, ' ',value