Regex заменить строку, которая находится до или после двух разных строк - PullRequest
2 голосов
/ 13 апреля 2019

У меня есть эта строка (html):

html = 'x<sub>i</sub> - y<sub>i)<sub>2</sub>' 

Я бы хотел преобразовать эту строку html в латекс надежным способом.Позвольте мне объяснить:

  1. <sub>SOMETHING</sub> -> преобразовано в _{SOMETHING}

Я уже знаю, как это сделать:

latex = re.sub(r'<sub>(.*?)</sub>',r'_{\1} ', html)
Иногда отсутствует первая часть <sub> или ее закрывающий тег, как в примере строки.В этом случае выходные данные все равно должны быть правильными.

Итак, как я думал об этом: после запуска 1 я беру строку после <sub> и что-нибудь до </sub> с помощью _{SOMETHING}

text = re.sub(r'<sub>(.*?)</sub>',r'_{\1} ', html)
print(text)
# if missing part:
text = re.sub(r'<sub>(.*?)',r'_{\1} ', text)
print(text)
latex  = re.sub(r'(.*?)</sub>',r'_{\1} ', text)

… но я получаю:

x_{i}  - y_{i)<sub>2} 
x_{i}  - y_{i)_{} 2} 
x_{i}  - y_{i)_{} 2} 

Что я хотел бы получить:

x_{i}  - y_{i})_{2}

Ответы [ 2 ]

2 голосов
/ 14 апреля 2019

Если у вас есть тексты, которые сегментированы на разные части, соответствующие теги <sub> / </sub> могут находиться в смежных сегментах, поэтому достаточно просто заменить их один за другим отдельно, и вам не нужносделать любое предположение сработать.

Просто используйте

text = text.replace('<sub>', '_{').replace('</sub>', '}')

, чтобы заменить каждый <sub> на _{ и </sub> на } в любом контексте.

1 голос
/ 13 апреля 2019

Вам нужно использовать жадные регулярные выражения (то есть без ?) для несопоставленных тегов, в противном случае вы всегда будете получать совпадения нулевой ширины.

>>> text = '1<sub>2'
>>> re.sub(r'<sub>(.*)', r'_{\1} ', text)
'1_{2} '

Кстати, пока вы это выясняли, я заметил, что выможно сложить вторые два регулярных выражения следующим образом:

re.sub(r'<sub>(.*)|(.*)</sub>', r'_{\1\2} ', text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...