Игнорирование "(" и ")" в 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 шт):

Автор решения: Namerek

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')

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

→ Ссылка