#python
#python
Вопрос:
Нужна помощь, у меня есть файл, который содержит текст с несколькими условиями if, мне нужно удалить конкретное условие if с помощью кода Python file1.js
if (aaaaa == b) {
qqqq
cccc
vvv
}
Проблема в том, что я не могу читать построчно, потому что «}» останется, и его будет трудно удалить, так как в файле будет «}».
может кто-нибудь, пожалуйста, указать
Мой фрагмент кода
import re
file_path = "C:/Users/abcd.js"
with open(file_path, "r") as f:
data = f.readlines()
with open(file_path, "w") as f:
for line in data :
if line == "{if (aaaaa == b) {" :
data = re.sub(r'if (aaaaa == b) {.*?}', '', data,flags=re.DOTALL)
print(data)
f.write(line)
Ответ №1:
Проблема, с которой вы столкнулись здесь, заключается в том, что .readlines()
считывает строку, разделенную символом перевода строки ( n
), и обрабатывает их как отдельные записи в массиве, поэтому ваш data
содержит:
data == ['if (aaaaa == b) {n', 'qqqqn', 'ccccn', 'vvvn', '}']
Если что-то не работает, запустите это через отладчик или выведите на консоль то, что на самом деле содержит переменная.
Попробуйте преобразовать этот массив в одну строку, затем заменить символы новой строки и передать это ваше регулярное выражение.
with open(file_path) as f:
data = f.readlines()
print(data)
mod_data = "".join(data).replace("n", "")
print(mod_data)
В качестве альтернативы используйте f.read()
, чтобы просто прочитать файл в виде одной строки.
Отредактировано:
Вы можете попробовать это таким образом и переработать свое регулярное выражение.
import re
file_path = "test2.py"
with open(file_path, "r") as f:
data = f.readlines()
data = "".join(data).replace("n", "")
data = re.sub(r'ifs(aaaaa == b)s{.*?}', 'this is a replacement', data, flags=re.DOTALL)
print(data)
with open(file_path, 'w') as f:
f.write(data)
Комментарии:
1. @ZAriel — Это действительно работает — проблема в том, что ваш шаблон регулярных выражений неверен.
(
,)
,{
,}
и пробелы являются специальными символами и должны быть экранированы. Вы только спросили, как справиться с последним}
, поэтому я предложил превратить его в строку и таким образом передать в регулярное выражение. Смотрите мой отредактированный ответ.2. @ZAriel это решение должно охватывать ваш тестовый пример, надеюсь, вы сможете применить его к тому, что вы хотите.
Ответ №2:
В этом примере удаляется ненужное условие с завершением }
file_path = "a.js"
with open(file_path, "r") as f:
data = f.readlines()
with open(file_path, "w") as f:
removing = False
for line in data :
if '}' in line and removing:
removing = False
continue
if 'if (aaaaa == b) {' in line:
removing = True
if not removing: f.write(line)
Комментарии:
1. это удаляет только условие if и первую строку, еще несколько строк и } не удаляются