Игнорирование "(" и ")" в re.sub()
Я не совсем понимаю как обращаться с функциями регулярных выражений... поэтому прошу помощи у знающих людей...
У меня есть задача в текстовом файле в котором записаны какие-либо значения в формате "name = 'text'" находить и заменять те или иные значения. Под данную задачу я нашел вот этот пост и немного доработал его.
def replace(pattern, subst):
with open(file, 'r', encoding="utf-8") as f:
for line in f:
if pattern in line:
pattern = line.replace('\n', '')
print(pattern)
split = line.split('=')
print(split)
file_handle = open(file, 'r', encoding="utf-8")
file_string = file_handle.read()
file_handle.close()
file_string = (
re.sub(pattern, split[0] + '= ' + "'" + subst + "'", file_string))
file_handle = open(file, 'w', encoding="utf-8")
file_handle.write(file_string)
file_handle.close()
И все бы ничего... но ингода в строках встречаются "(" и ")"... строка просто не заменяется... к сути дела... можно ли как-то заставить игнорировать круглые скобки?
Ответ для Namerek:
И так... Допустим в файле у меня есть строка "Name = 'Bob'"
Мне нужно поменять в этой строке 'Bob' на 'Jhon'
Я взываю функцию replace('Name', 'Jhon')
В таком случае все работает корректно и строка станет "Name = 'Jhon'"
Но в случае если в строке будут круглые скобки "Name = 'Bob(Blob)'"
При вызове функции replace('Name', 'Jhon'), строка остаётся неизменной.
Ответы (1 шт):
input.txt
Name = 'Bob(Blob)'
City = 'Berlin'
Country = 'Germany'
import re
def replace_param(field_name, value):
with open('input.txt', 'r', encoding='utf-8') as source:
modified_data = re.sub(
rf"(?<=^{field_name} = ').*?(?=')", value, source.read(), flags=re.M
)
with open('output.txt', 'w', encoding='utf-8') as destination:
destination.write(
modified_data
)
replace_param('Name', 'John')
output.txt
Name = 'John'
City = 'Berlin'
Country = 'Germany'
Кстати, если паредположить, что речь идет о, допустим, профиле пользователя, в котором нет параметров с одинаковым именем, то можно предложить еще одно решение без регулярных выражений (помятуя правило о неэффективности стрельбы из пушки по воробьям)
def split_line(line: str):
if ' = ' in line:
return line.strip().split(' = ', 1)
def join_line(params: tuple):
return ' = '.join(params)
def replace_param(field_name, value):
with open('input.txt', 'r', encoding='utf-8') as source:
src = dict(filter(None, map(split_line, source.readlines())))
src[field_name] = f"'{value}'"
with open('output.txt', 'w', encoding='utf-8') as destination:
destination.write(
'\n'.join(map(join_line, src.items()))
)
replace_param('Name', 'John')
При вышеуказанных данных, даст аналогичный эффект ...
Кроме того, даст возможность добавить параметр которого небыло