Python 使用文件';s startswith

Python 使用文件';s startswith,python,regex,Python,Regex,我有一个程序,它接受一个数字列表(逗号分隔)的输入,我应该遍历以这些数字开头的文件 myprogram.py 1,6,8 必须检查1001\u文件名、1004\u文件名、6001\u文件名、8003\u文件名、8004\u文件名等文件 一种方法是迭代3次(一次用于1*、6*、8*),如果 for file_type in file_types: file.startswith(file_type): 但是我怎样才能匹配列表中的任何一个呢 是否有可以执行以下操作的正则表达式: fi

我有一个程序,它接受一个数字列表(逗号分隔)的输入,我应该遍历以这些数字开头的文件

myprogram.py 1,6,8 
必须检查
1001\u文件名、1004\u文件名、6001\u文件名、8003\u文件名、8004\u文件名
等文件

一种方法是迭代3次(一次用于1*、6*、8*),如果

for file_type in file_types:
    file.startswith(file_type): 
但是我怎样才能匹配列表中的任何一个呢

是否有可以执行以下操作的正则表达式:


file.startswith(任何文件类型):
这里的文件类型是
1,6,8
或类似的类型?

这里不需要正则表达式。我建议在迭代文件时使用plain(
tuple
prefix
,这是自Python 2.5以来接受的)。下面是一个小演示:

>>> start_list = ('1', '6', '8')
>>> file_list = ['1001_filename', '1004_filename', '0000_filename']
>>> for filename in file_list:
...     if filename.startswith(start_list):
...         print(filename)
... 
1001_filename
1004_filename
您可以使用查找所有文件:

from glob import glob
path = "path_to/"
files = glob(path+"[1,5,8]*")

我们将匹配以
1
5
8
开头的任何文件,无论
path
指向哪个目录。

作为记录,我同意这不是一个regex必需的问题,但我确实喜欢regex,所以这里介绍了如何使用regex

from re import findall, escape

start_list = ['1', '6', '8']
file_list = ['1001_filename', '1004_filename', '0000_filename']

print findall(r'^(%s)' % escape('|'.join(start_list)), file_list)
太过分了,不应该真正格式化正则表达式,除非这样做非常明确,都是糟糕的答案。我只是喜欢正则表达式


编辑:添加在re.escape中,以避免遇到太多问题

您可以使用基于timgeb答案的列表理解

start_list = ['1', '6', '8']
file_list = ['1001_filename', '1004_filename', '0000_filename']
c = [filename for filename in file_list if any(filename.startswith(start) for start in start_list)]

@我认为这取决于当名字匹配时你想做什么。如果你想打印它,map会有点难看,对吗?你仍然在使用for循环,我想避免:如果有(filename.startswith(start)在start_列表中代表start):@Victor我理解你的问题的方式,你想避免重复三次。嗯,我一直在想
如果有(map(str.startswith…
,但是需要将参数传递给映射函数的目的失败了(将需要使用lambda),因此无需考虑…@timgeb:您甚至不需要
任何
前缀
参数可以是要检查的字符串的
元组。因此更改为
start\u list=('1','6','8'))
并检查
如果filename.startswith(start_list):
和Python为您执行
任何
操作,并更高效/简洁地引导。@Victor看起来像是
glob
使用的,它最终包含for循环。这没什么大不了的,我……我得到的空数组是:print glob(path+“[1]*”)尽管我有与1*@heltonbiker匹配的文件,但我相信系统库循环一定比我优化得多,我只是把它留给了系统。@Victor,对于一个位数,你只需要
1*
我很感激你的赞美,我仍然觉得这有些过分,但我想这取决于你处理的数据量有多大g with.也可能应该添加一个
re.escape
,这样就不会有人试图查找以
开头的文件,并最终找到所有文件。