为什么这些字符串在python中从我的正则表达式中逃脱?

时间:2011-01-08 21:40:11

标签: python list iteration

在我的代码中,我将整个文件夹加载到列表中,然后尝试除去.mp3文件之外的列表中的每个文件。

import os
import re
path = '/home/user/mp3/'
dirList = os.listdir(path)
dirList.sort()
i = 0
for names in dirList:
  match = re.search(r'\.mp3', names)
  if match:
    i = i+1
  else:
    dirList.remove(names)
print dirList
print i

运行文件之后,代码确实摆脱了列表中的一些文件,但特别保留了这两个文件:

  

[' 00。各种艺术家 - 独立摇滚播放列表2008年10月.m3u',' 00。各种艺术家 - 独立摇滚播放列表2008年10月.pls']

我无法理解发生了什么,为什么这两个人专门逃避我的搜索。

3 个答案:

答案 0 :(得分:4)

您正在循环中修改列表。这可能会导致问题。您应该循环遍历列表的副本(for name in dirList[:]:),或创建新列表。

modifiedDirList = []
for name in dirList:
    match = re.search(r'\.mp3', name)
    if match:
        i += 1
        modifiedDirList.append(name)

print modifiedDirList

甚至更好,使用列表理解:

dirList = [name for name in sorted(os.listdir(path))
           if re.search(r'\.mp3', name)]

同样的事情,没有正则表达式:

dirList = [name for name in sorted(os.listdir(path))
           if name.endswith('.mp3')]

答案 1 :(得分:3)

也许你应该使用glob模块 - 这是你的整个脚本:

>>> import glob
>>> mp3s = sorted(glob.glob('*.mp3'))
>>> print mp3s
>>> print len(mp3s)

答案 2 :(得分:2)

一旦调用dirList.remove(names),原始迭代器就无法执行您想要的操作。如果迭代列表的副本,它将按预期工作:

for names in dirList[:]:
    ....

或者,您可以使用list comprehensions构建正确的列表:

dirList = [name for name in dirList if re.search(r'\.mp3', name)]