为什么这些字符串会从 python 中的正则表达式中转义?

发布于 2024-10-10 17:13:47 字数 507 浏览 3 评论 0 原文

在我的代码中,我将整个文件夹加载到列表中,然后尝试删除列表中除 .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']

我不明白发生了什么,为什么这两个人专门逃避我的搜索。

In my code, I load up an entire folder into a list and then try to get rid of every file in the list except the .mp3 files.

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

After I run the file, the code does get rid of some files in the list but keeps these two especifically:

['00. Various Artists - Indie Rock Playlist October 2008.m3u', '00. Various Artists - Indie Rock Playlist October 2008.pls']

I can't understand what's going on, why are those two specifically escaping my search.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

乱了心跳 2024-10-17 17:13:47

您正在循环内修改列表。这可能会导致问题。您应该改为循环遍历列表的副本(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')]

You are modifying your list inside a loop. That can cause issues. You should loop over a copy of the list instead (for name in dirList[:]:), or create a new list.

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

print modifiedDirList

Or even better, use a list comprehension:

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

The same thing, without a regular expression:

dirList = [name for name in sorted(os.listdir(path))
           if name.endswith('.mp3')]
不可一世的女人 2024-10-17 17:13:47

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

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

maybe you should use the glob module - here is you entire script:

>>> import glob
>>> mp3s = sorted(glob.glob('*.mp3'))
>>> print mp3s
>>> print len(mp3s)
烧了回忆取暖 2024-10-17 17:13:47

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

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

或者,您可以使用 列表推导式 构建正确的列表:

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

As soon as you call dirList.remove(names), the original iterator doesn't do what you want. If you iterate over a copy of the list, it will work as expected:

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

Alternatively, you can use list comprehensions to construct the right list:

dirList = [name for name in dirList if re.search(r'\.mp3', name)]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文