У меня есть следующий код, который будет хранить все имя файла csv в списке из определенной папки
import pandas as pd
import re
import os
files = os.listdir('.')
filename=[filename for filename in files if filename.endswith('.csv')]
Однако в моей папке у меня есть два типа файлов csv, один заканчивается, например, _20.cvs (или, может быть, _18.csv, _01.csv), другой заканчивается _Raw.csv;
Однако мне нужен только первый тип, который хранится в моем списке. Я знаю, что регулярное выражение может помочь мне в этом, поэтому я сделал несколько поисков google и придумал следующий код, но, похоже, он не работает, может ли кто-нибудь предложить совет?
filename = [re.search(r'^d{2}.csv'),filename).group(0) for filename in files]
Всего 4 ответа
Вам нужно удалить ^
(поскольку это соответствует началу расположения строки), добавить $
в конце шаблона (чтобы убедиться, что совпадение находится в конце строки) и избежать точки (иначе, соответствует любому символу char, но символ разрыва строки).
Обратите внимание, что перед доступом к .group()
необходимо проверить, есть ли совпадение.
result = [f for f in files if re.search(r'_d{2}.csv$', f)]
подробности
_
- знак подчеркивания d{2}
- 2 цифры .
- буквальная точка csv
- текст csv
$
- конец строки. См. Демо-версию regex .
import re
files = ["gfrt_32_20.csv", "wertf_18.csv", "12_01.csv", "ith_Raw.csv"]
result = [f for f in files if re.search(r'_d{2}.csv$', f)]
print(result)
# => ['gfrt_32_20.csv', 'wertf_18.csv', _01.csv']
re.match не будет работать, потому что он совпадает в начале. Вместо этого используйте re.search. Но все остальное хорошо в предыдущем решении.
import os
import re
files = os.listdir('.')
filenames = [f for f in files if re.search(r'(_d+.csv)', f)]
print(filenames)
Попробуйте использовать метод re.match
:
import os
import re
files = os.listdir('.')
filenames = [f for f in files if re.match(r'(_d+.csv)', f)]
print(filenames)
Вы должны поместить операцию регулярного выражения в предложение if
, чтобы отфильтровать те, которые вы не хотите.
Вам также следует избегать .
в регулярном выражении, поскольку точки имеют особый смысл в регулярном выражении (соответствуют всем нестрочным терминаторам).
[filename for filename in files if re.search(r'd{2}.csv$', filename)]
Если вы хотите только согласованный бит, вы можете сделать простую подстроку:
[filename[-6:] for filename in files if re.search(r'd{2}.csv$', filename)]