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
,这样就不会有人试图查找以“
开头的文件,并最终找到所有文件。