如果你使用集合.defaultdict(list),你得到一个列表,这个字典的元素是列表。如果找不到键,则会使用空列表的值添加该键,这样您就可以立即开始追加到列表中。这就是这条线的作用:d[dir].append(match.group(1))
如果目录名不存在,它会将目录名创建为键,并将找到的文件名追加到列表中。在
顺便说一句,如果您在使正则表达式正常工作时遇到问题,请尝试使用调试标志创建它们。我记不起这个象征性的名字了,但号码是128。如果您这样做:
^{pr2}$
您将获得以下附加输出:at at_beginning
literal 45
literal 62
literal 32
subpattern 1
min_repeat 1 65535
any None
at at_end
您可以看到有一个开始行匹配加上'->;'(对于45 62 32),然后是重复的任何模式和行尾匹配。对调试非常有用。在
代码:from __future__ import with_statement
import re
import collections
def get_values(file):
d = collections.defaultdict(list)
dir = ""
dir_regex = re.compile(r'^Directory: (.+?)\\$')
file_regex = re.compile(r'\-\> (.+?)$')
with open(file) as f:
for line in f:
line = line.strip()
match = dir_regex.search(line)
if match:
dir = match.group(1)
else:
match = file_regex.search(line)
if match:
d[dir].append(match.group(1))
return d
if __name__ == '__main__':
d = get_values('test_file')
for k, v in d.items():
print k, v
结果:Images ['01-some_image1.jpg', '02-some_image2.jpg']
Music ['01-some_song1.mp3', '02-some_song2.mp3', '03-some_song3.mp3']