2015-11-02 3 views
0

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

first line 

#description 

hello my friend 

Я хотел бы получить этот результат:

first line 
hello my friend 

К сожалению, этот код не работает по какой-то причине:

with open(input_file,"r+") as f: 
string = re.sub(re.compile(r'\n#.*'),"",f.read())) 
f.seek(0) 
f.write(string) 

по какой-то причине выход, который я получаю, тот же, что и вход.

+1

С одной стороны, это неправильно отступы ... Вы пытались разделить его на более мелкие шаги и проверить каждый? – jonrsharpe

+1

Вы не сравниваете по строкам, я не думаю. Попробуйте многострочное совпадение: 're.compile ('^ #. *', Re.MULTILINE)'. – RobertB

+0

После исправления нескольких синтаксических ошибок я обнаружил, что ваша программа работает точно так, как ожидалось. Пожалуйста, предоставьте краткую, полную, в противном случае, правильную программу, демонстрирующую ошибку. См. Http://stackoverflow.com/help/mcve для получения дополнительной информации. –

ответ

0

1) Нет причин для звонка re.compile, если вы не сохраните результат. Вы всегда можете просто использовать текст регулярного выражения.

2) Поиск в начале файла и запись могут вызвать проблемы для вас, если ваш текст замены короче исходного текста. Легче повторно открыть файл и записать данные.

Вот как я бы исправить вашу программу:

import re 
input_file = 'in.txt' 
with open(input_file,"r") as f: 
    data = f.read() 

data = re.sub(r'\n#.*', "", data) 

with open(input_file, "w") as f: 
    f.write(data) 
0

Это не похоже право начать регулярное выражение с \n, и я не думаю, что вам нужно использовать re.compile здесь.

В дополнении к этому, вы должны использовать флаг re.M, чтобы сделать поиск на многострочном

Это удалит все строки, которые начинаются с # и пустыми строками.

with open(input_file, "r+") as f: 
    text = f.read() 
    string = re.sub('^(#.*)|(\s*)$', '', text, flags=re.M) 
    f.write(string) 
Смежные вопросы