使用Python修复HTML字符串中的开括号问题

时间:2019-04-11 21:11:11

标签: python string

我有以下文字:

string = "<i>R</i> subspace  <i>{V.</i> generated by <i>{v<sub>1</sub>,...,v<sub>i</sub></i>, "

细心的读者可能会发现缺少两个方括号。 我想知道,如何使用python解决此问题?

预期输出为:

the <i>R</i>  subspace  <i>{V.}</i> generated by <i>{v<sub>1</sub>,...,v<sub>i</sub>}</i>,

一个可以:

  1. 检查:<i>之后是否有括号?
  2. 如果是-> </i>前面是否有括号?

我不知道该如何编码。任何帮助将非常感激。

编辑1:

我发现this code,可以告诉您方括号是否匹配。

1 个答案:

答案 0 :(得分:2)

以下正则表达式解决方案如何?

import re

string = "<i>R</i> subspace  <i>{V.</i> generated by <i>{v<sub>1</sub>,...,v<sub>i</sub></i>, "
expected = "<i>R</i> subspace  <i>{V.}</i> generated by <i>{v<sub>1</sub>,...,v<sub>i</sub>}</i>, "

fixed = re.sub(r"<(?P<tag>.*?)>({.*?)</(?P=tag)>", r"<\1>\2}</\1>", string)

print(fixed == expected) # True

这个想法是匹配一个标签,然后加上一个花括号,找到它的结束标签,并使用捕获组作为<\1>\2}</\1>将伴侣花括号放在结束标签之前。细目:

< # literal opening bracket
 (?P<tag> # open a named capture group
         .*? # lazily match any characters
            ) # end named capture group
             > # literal closing bracket
              ( # open capture group 2
               { # literal opening brace
                .*? # lazily match any characters
                   ) # end capture group 2
                    < # literal opening bracket
                     / # literal slash
                      (?P=tag) # backreference to the named group
                              > # literal closing bracket

如果只想使用<i>,则可以使用re.sub(r"<i>({.*?)</i>", r"<i>\1}</i>", string)