Как заставить регулярное выражение возвращать строку (не объект регулярного выражения)?

#python #regex #python-2.7

#python #регулярное выражение #python-2.7

Вопрос:

Я прочитал документацию по регулярным выражениям, но это очень сбивает с толку начинающего программиста вроде меня. Итак, мое последнее средство — опубликовать здесь.

 # Tivo Notifier
import os, re

WATCH_DIR = "D:/tivo"
TO_FIND = [".*big.brother.uk.s15.*", ".*mock.the.week.*", ".*family.guy.*"]

# open history log file
history = open("history.txt", "w ")

# get downloaded files
files = os.listdir(WATCH_DIR)

# compare each file to regex patterns
for pattern in TO_FIND:
    regex =  re.compile(pattern)
    match = [m.group(0) for file in files for m in [regex.search(file)] if m]

    for filename in match:
        if filename not in history.read():      # if a new match is found
            print "new:", filename              # display new match file name
            history.write(filename)             # add file name to history file
history.close()
  

Проблема здесь в том, что он записывает тонну мусора в файл истории:
http://pastebin.com/3C5iVbU7

Я предполагаю, что это потому filename , что это не строка, а, вероятно, своего рода объект регулярных выражений. Я не вижу в документации, как вернуть строку.

Я хотел бы добавить только имя файла в файл истории, а не текст мусора, который фактически добавляется из этого скрипта.

Может кто-нибудь сказать мне, как это сделать?

Комментарии:

1. Я не думаю history.read() , что возвращает список, он возвращает одну строку. Так filename not in history.read() не сработает. Вам нужно history.read().split('n') .

2. Кроме того, чтение всего файла истории каждый раз через цикл очень неэффективно. Прочитайте это один раз в начале.

3. Вам нужно написать новую строку после каждого имени файла в файле истории.

Ответ №1:

Вот более простой способ, который использует glob вместо регулярных выражений. Он также использует наборы для ведения истории и новых файлов.

 import os, glob

WATCH_DIR = 'D:/tivo'
TO_FIND = ['*big.brother.uk.s15*', '*mock.the.week*', '*family.guy*']

history = set(open('history.txt').read().splitlines())

new_files = set()
for pattern in TO_FIND:
        files = glob.glob(os.path.join(WATCH_DIR, pattern))
        # optionally strip directories from file names
        files = [os.path.basename(f) for f in files]
        new_files.update(files)

new_files = new_files.difference(history)
for f in sorted(new_files):
        print "new: %s" % f

history.update(new_files)
open('history.txt', 'w').write('%sn' % 'n'.join(sorted(history)))