Замена слов в файле с помощью регулярных выражений - PullRequest
1 голос
/ 02 ноября 2019

У меня есть файл с более чем 40k строк внутри, который мне нужно заменить слова, строки с помощью регулярных выражений. Я не могу заставить это работать самостоятельно. Допустим, файл выглядит так:

test >
test >
test >
test >
def start():
        file = input("file: ")
        fread = open(file, "r")
        linelist = fread.readlines()
        fread.close()
        fwrite = open(file, "w")
        line = re.sub(".*(?=>)", " ", str(linelist))
        fwrite.write(line)
        fwrite.close()


start()

Но вместо удаления test и выдачи мне:

>
>
>

Это дает мне

  >\n']

и никаких других строк

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

linelist - это list, вы конвертируете это в строку, в результате чего re.sub удаляет все до последнего >\n]. Когда вы запускаете str в списке, вы получаете, например:

In [1]: str([1, 2])
Out[1]: '[1, 2]'

Это основная проблема. Вам нужно перебрать список и выполнить операции с каждой строкой отдельно и сохранить измененную строку.

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

Также я бы предложил вам использовать отдельные файлы для чтения и записи, когда вы выполняете операции над каждой строкой файла, а затем записываете обратно втот же файл. Если вы должны использовать один и тот же файл, я бы использовал отдельные файлы, а затем заменил (shutil.move) считывающий файл на записывающий, как только операции будут завершены.

Итак, в целом, лучшим подходом будет итерациянад файловым объектом (так как это итератор) и выполните операцию:

with open('input_file') as in_file, open('output_file', 'w') as out_file:
    for line in in_file:
        modified_line = re.sub(r'^.*(?=>)', ' ', line)
        out_file.write(modified_line)

open - это менеджер контекста, поэтому вы можете использовать with statememnt для него, он имеет дополнительные преимущества при вызове close для файлового объекта, поэтому вам не нужно закрывать их вручную.

Если ваш шаблон точно такой же, как показано в примере, вы можете использовать str.replace, нет необходимости в Regex:

modified_line = line.replace('test ', ' ')
0 голосов
/ 02 ноября 2019

Проверьте свое регулярное выражение в "python online regexp tester". RegExp легко ошибиться. Это скажет вам, если у вас все правильно.

Если вам просто нужен вывод, в отличие от скрипта Python, попробуйте notepad ++. Он поддерживает регулярные выражения и может обрабатывать 40000 строк. Многие другие редакторы тоже. Не кодируйте, если нет необходимости.

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