正则表达式替换两个不同字符串之前或之后的字符串

时间:2019-04-12 22:10:03

标签: python regex

我有这个字符串(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)
  1. 有时缺少第一部分<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 个答案:

答案 0 :(得分:2)

假设您将文本分为不同的部分,则相应的<sub> / </sub>标签可能位于相邻的句段中,因此只需将它们分别替换一个就足够了,不需要做任何猜测。

只需使用

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

在任何情况下都用<sub>替换每个_{,并用</sub>替换}

答案 1 :(得分:1)

对于不匹配的标记,您需要使用贪婪的正则表达式(即不使用?),否则始终会得到零宽度的匹配。

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

顺便说一句,在弄清楚这一点时,我注意到您可以像这样将后两个正则表达式放在一起:

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