Найдите в строке и замените значением из списка в python с помощью регулярного выражения

#python #regex #replace #find

Вопрос:

 my_string = """"
Hello [placeholder],

I would [placeholder] to work with you. I need your [placeholder] to complete my project.

Regards,
[placeholder]
"""

my_lst = ['John', 'like', 'help', 'Doe']
 

Я хочу поместить это значение списка в my_string.

Итак, моя строка будет: «»» Привет, Джон, я хотел бы поработать с тобой. Мне нужна ваша помощь, чтобы завершить мой проект. С уважением, Доу «»»

Здесь количество [заполнителей] и длина списка будут динамическими. Итак, мне нужно динамичное решение. Это будет работать для любой строки, независимо от количества [заполнителя] и длины списка. Как я могу сделать это на Python? Заранее спасибо.

Комментарии:

1. my_string.replace("[placeholder]", "{}").format(*my_lst) Или просто используйте {} вместо [placeholder] и звоните str.format() без каких-либо дополнительных замен. Более подробная информация о синтаксисе строк формата приведена здесь .

2. Спасибо, все работает нормально. Но иногда # [заполнителя] и длина списка могут не совпадать. Я хочу заменить [заполнитель] пустой строкой, если в списке недостаточно значений. Как я могу это сделать?

3. Вы можете подкласс Formatter и переопределить get_value() метод, чтобы вернуть пустую строку, если индекс больше или равен длине аргументов.

Ответ №1:

С помощью регулярного выражения вы можете использовать re.sub и ламбаду для pop элементов из списка

 my_string = re.sub(r'[(.*?)]', lambda x: my_lst.pop(0), my_string)
 

Правка в отношении комментария иногда # [заполнителя] и длина списка могут не совпадать.:

Вы можете использовать пустую строку в том lambda случае, если список пуст

 my_string = re.sub(r'[(.*?)]', lambda x: my_lst.pop(0) if my_lst else '', my_string)
 

Комментарии:

1. lambda x, l=my_lst[:]: l.pop(0) или lambda x, l=iter(my_lst): next(l), может быть альтернативой (последнее лучше) , если изменение my_lst не разрешено.

2. lambda x, l=iter(my_lst): next(l, "") следовать условиям из комментариев.

Ответ №2:

Это будет лучше использовать {} вместо [placeholder] , потому что это позволит вам распаковать список замен по умолчанию str.format() без каких-либо дополнительных изменений.

 my_string = """
Hello {},

I would {} to work with you. I need your {} to complete my project.

Regards,
{}
"""
my_lst = ['John', 'like', 'help', 'Doe']

my_string = my_string.format(*my_lst)

 

Если изменение этого «шаблона» невозможно, вы можете сделать это программно, используя str.replace() .

 my_string = my_string.replace("[placeholder]", "{}").format(*my_lst)
 

Если количество заполнителей может превышать длину my_lst , вы можете использовать пользовательский формат, который вернет значение по умолчанию.

 from string import Formatter

class DefaultFormatter(Formatter):
    def __init__(self, default=""):
        self.default = default
    
    def get_value(self, key, args, kwargs):
        if isinstance(key, str) or key < len(args):
            return super().get_value(key, args, kwargs)
        else:
            return self.default

fmt = DefaultFormatter()
my_string = fmt.format(my_string.replace("[placeholder]", "{}"), *my_lst)