Регулярное выражение Python: перебирать список строк, используя re.findall - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть список, который является не чем иным, как списком имен файлов.

['20190918_TrialBalance_TPBL.txt','20190918_ManagerBalance_TPCL.txt','20190918_ManagerBalance_TPCH.txt']

Цель:

Я хочу знать, содержит ли список какой-либо файл, имя которого содержит «TrialBalance».

MyПодход:

Я пытаюсь перебрать этот список, используя regex.

import re
files=[]
for f in list_files:
    tbl = re.findall(r'trial.*\.txt$',f, re.IGNORECASE)
    files.append(tbl)

Приведенные выше коды не дают никакого результата, т.е. я получаю пустой список.

Однако, когда я применяю re.findall к отдельным пунктам, т.е. re.findall(r'trial.*\.txt$',list_files[0], re.IGNORECASE), я получаю правильный ответ.

Может кто-нибудь помочь мне, указав пропущенную строку?

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Это проще:

files=[]
for f in list_files:
    if  'TrialBalance' in f:
        files.append(f)
0 голосов
/ 22 сентября 2019

Использование re.findall является неэффективным для вашего случая, используйте следующий подход с подготовленным шаблоном регулярных выражений и функцией re.search:

import re

list_files = ['20190918_TrialBalance_TPBL.txt', '20190918_ManagerBalance_TPCL.txt', '20190918_ManagerBalance_TPCH.txt']
pat = re.compile(r'trial.*\.txt$', re.I)
trial_files = [f for f in list_files if pat.search(f)]

print(trial_files)  # ['20190918_TrialBalance_TPBL.txt']

Подход без регулярных выраженийтакже возможно:

list_files = ['20190918_TrialBalance_TPBL.txt', '20190918_ManagerBalance_TPCL.txt', '20190918_ManagerBalance_TPCH.txt']
trial_files = []
for f in list_files:
    f_ = f.lower()
    if 'trial' in f_ and f_.endswith('.txt'):
        trial_files.append(f)

print(trial_files)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...