Использование регулярного выражения со списком в python

У меня есть следующий код, который будет хранить все имя файла 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 .

Демо-версия Python :

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)]

Есть идеи?

10000