У меня есть список файлов с такими именами.
["TYBN-220422-257172171.txt", "TYBN-120522-257172174.txt", "TYBN-320422-657172171.txt", "TYBN-220622-237172174.txt", "TYBN-FRTRE-FFF.txt",....]
Я хочу получать только файлы такого формата TYBN-220422-257172171.txt
valid = "TYBN-{}-{}".format(numericvalue, numericvalue)
Я хочу, чтобы этот тип файлов был только в списке.
Это, вероятно, проще всего сделать с помощью регулярного выражения, чтобы соответствовать желаемому формату, т.е.
TYBN-\d+-\d+\.txt$
который ищет имя, начинающееся с символов TYBN-
, за которыми следует одна или несколько цифр (\d+
), -
, еще несколько цифр и затем заканчивается .txt
.
Обратите внимание, что при использовании re.match
(как в приведенном ниже коде) совпадения автоматически привязываются к началу строки, поэтому в регулярном выражении не требуется начальный ^
(привязка к началу строки).
В питоне:
import re
filelist = ["TYBN-220422-257172171.txt",
"TYBN-120522-257172174.txt",
"TYBN-320422-657172171.txt",
"TYBN-220622-237172174.txt",
"TYBN-FRTRE-FFF.txt"
]
regex = re.compile(r'TYBN-\d+-\d+\.txt$')
valid = [file for file in filelist if regex.match(file)]
Выход:
[
'TYBN-220422-257172171.txt',
'TYBN-120522-257172174.txt',
'TYBN-320422-657172171.txt',
'TYBN-220622-237172174.txt'
]
Попробуй это.
lst = ["TYBN-220422-257172171.txt", "TYBN-120522-257172174.txt", "TYBN-320422-657172171.txt", "TYBN-220622-237172174.txt", "TYBN-FRTRE-FFF.txt"]
valid_format = ['TYBN',True,True] # here true for digits
valid = []
for a in lst:
l = a.replace('.txt','').split('-')
if l[0] == valid_format[0]:
if [i.isdigit() for i in l[1:]] == valid_format[1:]:
valid.append(a)
print(valid)
ВЫХОД:
['TYBN-220422-257172171.txt',
'TYBN-120522-257172174.txt',
'TYBN-320422-657172171.txt',
'TYBN-220622-237172174.txt']
Объяснение регулярного выражения:
import re
files = ["TYBN-220422-257172171.txt", "TYBN-120522-257172174.txt"]
pattern = re.compile("^TYBN-\d+-\d+\.txt$")
for f in files:
if pattern.match(f):
print(f + " matched naming convention.")
Спасибо за подробный ответ. Еще одна просьба, если я хочу добавить еще одно условие при сопоставлении. здесь -220422-257172171
длина должна быть 6 и 9 соответственно. как я могу сделать это здесь?
re.compile("^TYBN-\d{6}-\d{9}\.txt$")
? Я думаю, это сработает.
@D_P, это сработает, как я сказал в своем ответе, вам не нужно начальное ^
, поскольку re.match
все равно всегда привязывает совпадения к началу строки. Так что просто TYBN-\d{6}-\d{9}\.txt$
Модуль ре был изобретен, чтобы устранить необходимость в таком коде.