Указание каталога в качестве входных данных в Python Regex - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь извлечь конкретный текст из имени файла с помощью регулярных выражений, и я могу это сделать, если в качестве входных данных я передаю только одно имя файла. Тем не менее, я хочу сделать то же самое для всех имен файлов в определенном каталоге. Я понимаю, что re.search может принимать только строку в качестве ввода? Есть ли способ передать каталог в качестве входа?

Ниже код, который я использую,

import os
import sys
import re
firstarg=sys.argv[1]
a = str(firstarg)
m = re.search(r'(?<=T)(.*)(?=\()', os.listdir( a )).group()
print (m)

1 Ответ

0 голосов
/ 24 октября 2019

Это напечатает массив строк, которые соответствуют регулярному выражению. Это запустит регулярное выражение для каждого файла и папки в каталоге,и если какой-либо файл или папка содержит совпадение, это сопоставление добавляется в массив 'm'Примечание: не рекурсивно.

import os
import sys
import re

firstarg=sys.argv[1]
a = str(firstarg)
files = os.listdir(a)
m = []

for f in files:
    match = re.search(r'(?<=T)(.*)(?=\()', f)
    if( match != None):
        m.append( match.group() )

print (m)

Пример:sys.argv [1] = '/'Дерево файлов:

  • /
    • File_Tvalue1 (
    • File_Tvalue2 (
    • Folder_Tvalue3 (
      • File_Tvalue4 (
      * 1017)*

Результат:['value1', 'value2', 'value3']

Если вы хотите, чтобы он был рекурсивным и функцией.

import os
import sys
import re
def FindMatchesInDirectory(directory, afterRegex, beforeRegex, recursive=True):
    results = []
    for r, d, f in os.walk(directory):
        for path in f:
            match = re.search(r'(?<='+str(afterRegex)+')(.*)(?='+str(beforeRegex)+')', str(path))
            if( match != None):
                results.append( match.group() )    
        for path in d:
            match = re.search(r'(?<='+str(afterRegex)+')(.*)(?='+str(beforeRegex)+')', str(path))
            if( match != None):
                results.append( match.group() )    
        if ( recursive != True):
            break
    return results

Пример: получить все совпадения рекурсивно. Любое значение между 'T' и '('

print (FindMatchesInDirectory(sys.argv[1], 'T', '\('))

Результат:['value3', 'value2', 'value1', 'value4']

Пример: получить все совпадения без рекурсии

print (FindMatchesInDirectory('/', 'T', '\(', False))

Результат:['value3', 'value2', 'value1']

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