Вставка строк в определенные места в тексте

#python #regex #python-3.x

#python #регулярное выражение #python-3.x

Вопрос:

Мне нужно преобразовать некоторый текст в формат Latex.

 123 {i1}e11 e22{i0} asa ds dawdas a as<asd a<asd <ads sasdasdasd
  

Моя цель — поместить все, что находится между {i1} и {i0}, в $ и вместо этого $ и добавить » » между каждым словом.

Ожидаемый результат:

 123 $e11  e22 $ asa ds dawdas a as<asd a<asd <ads sasdasdasd
  

или (это тоже нормально)

 123 $e11  e22  $ asa ds dawdas a as<asd a<asd <ads sasdasdasd
  

Что я пробовал:

 text = '123 {i1}e11 e22{i0} asa ds dawdas a as<asd a<asd <ads sasdasdasd'
a = re.sub(r'{\i1}(.*?){\i0}', r' $1$', text)
  

123 $e11 e22$ asa ds dawdas a as

… но как мне получить эти «» между ними?

Ответ №1:

Вы можете использовать

 import re
text = '123 {i1}e11 e22{i0} asa ds dawdas a as<asd a<asd <ads sasdasdasd'
rx = r'{\i1}(.*?){\i0}'
a = re.sub(rx, lambda x: r' ${} $'.format(r"  ".join(x.group(1).split())), text)
print(a) # => 123  $e11  e22 $ asa ds dawdas a as<asd a<asd <ads sasdasdasd
  

Смотрите онлайн-демонстрацию Python.

Здесь re.sub(rx, lambda x: r' ${} $'.format(r" ".join(x.group(1).split())), text) приведен вызов re.sub , где вторым аргументом является лямбда-выражение. Совпадение передается там как x , x.group(1) является «эквивалентом» 1 обратной ссылки в шаблоне замены строки. Он разделен пробелами и соединен обратно пробелом обратная косая черта пробел и вместе с последовательностями пробел доллар на обоих концах вставляется в результирующую строку вместо значения соответствия.