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