У меня есть программа, которая принимает на вход список чисел (через запятую), и я должен пройти через файлы, которые начинаются с этих чисел

myprogram.py 1,6,8 

Должны просмотреть файлы, которые 1001_filename, 1004_filename, 6001_filename, 8003_filename, 8004_filename и т. д.,

Один из способов - повторить 3 раза (один раз для 1 *, 6 *, 8 *) и сделать, если

for file_type in file_types:
    file.startswith(file_type): 

Но как я могу соответствовать любому в списке?

Есть ли регулярное выражение, которое может сделать что-то вроде:

file.startswith(any of file_types): file_types здесь - это 1,6,8 или что-то в этом роде?

3
Victor 17 Дек 2015 в 04:55

4 ответа

Лучший ответ

Вы можете использовать glob, чтобы найти все свои файлы:

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

Мы сопоставим любой файл, начинающийся с 1, 5 или 8 в любом каталоге, на который указывает path.

4
Padraic Cunningham 17 Дек 2015 в 02:10

Для справки, я согласен, что это не необходимый вопрос регулярных выражений, но я люблю регулярные выражения, поэтому вот как это сделать с помощью регулярных выражений

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, чтобы не столкнуться с слишком многими проблемами

1
OnGle 17 Дек 2015 в 02:34

Вам не нужно регулярное выражение здесь. Я предлагаю использовать простой str.startswith с {{X1} } принятых префиксов (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
2
ShadowRanger 17 Дек 2015 в 02:12

Вы можете использовать понимание списка на основе ответа Тимгеба.

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)]
1
autopython 17 Дек 2015 в 02:17