python - 使用 Python 修复 HTML 字符串中的左括号问题
问题描述
我有以下文字:
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>,
一个可以:
- 检查: 后面有括号
<i>
吗? - 如果是 -> 之前有括号
</i>
吗?
我该如何编码?
编辑
我找到了这段代码,它可以告诉你括号是否匹配。
解决方案
以下正则表达式解决方案怎么样:
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)
.