这是一个编码练习。我应该使用python将html解析为一个字符串,使得html字符串如下所示:
"<div><p><b></b></p><p></p><p></p></div>"
成为:
"DIV([P([B([])]),P([]),P([])])"
每个包含其他全局标记的全局标记必须以逗号分隔的方式返回。
我知道,正则表达式不是此类工作的最佳选择。但是,我只能使用有限的一组工具,其中正则表达式就是其中之一。
到目前为止,我所拥有的是以下内容:
repl_from = ["<div>", "</div>", "<img />", "<p>", "</p>", "<b>", "</b>"]
for i in repl_from:
if i == "<div>":
j = "DIV(["
elif i == "<img />":
j = "IMG({})"
elif i == "<p>":
j = "P(["
elif i == "<b>":
j = "B(["
else: j = "])"
html = html.replace(i, j)
这使我DIV([P([B([])])P([])P([])])
。现在,我必须将内部参数用逗号分开,这就是我考虑使用正则表达式的地方。但是我在这方面迷失了。
我有一个伪代码,如下所示:
1)查找全局标签(patternI = '[A-Z]+\(\[)'
)的开头
2)检查以下内容是否是重复标签(patternII = '[A-Z]+\(\[\]\)+'
)
3)如果是这样,请获取patternII
的开始和结束索引,然后只用逗号替换即可。我认为,可以通过使用split()
和后来的join()
函数进行拆分来简单地执行最后一部分。
如何实现算法的最后一部分?
编辑
好的,我认为我在解释情况时犯了一个错误。对于任何包含另一组标签的标签(例如<div><p></p><p></p></div>
),必须将所包含的标签解析为全局标签的参数(因此:DIV([P([]), P([])])
);如果全局标记仅包含一个,则不添加逗号(<div><p></p></div>
会变成DIV([P([])]
)。在没有封闭标记的情况下(例如<p></p><b></b>
),则在对其进行转换时,它们之间就没有逗号(例如P([])B([])
)。
答案 0 :(得分:1)
我确定我对这里的内容不了解,但是如果是这种情况,为什么不使用简单的方法:
a="DIV([P([B([])])P([])P([])])"
import re
print(re.sub(r"\)[A-Z]","),P",a))
这将给出:
'DIV([P([B([])]),P([]),P([])])'
我必须道歉,因为我根本不了解html,因此我只能尝试将您的结果匹配为“ a”值(因为我无法想象所有可能的情况)关于您最近的评论
别说:
a="DIV([P([B([])])P([])B([])])P([])B([])"
我们可以结合使用re.findall
和re.sub
来解决此问题:
首先,我们将在以下位置找到所有要替换的内容:
b=re.findall(r"\)[A-Z]",a)
print(b)
这将给出:
[')P', ')B', ')P', ')B']
此后,我们将需要在每个元素之间插入逗号,因为我们将使用它来替换原始元素:
for i in range(len(b)):
b[i]=b[i][0]+","+b[i][1]
print(b)
这将给出:
['),P', '),B', '),P', '),B']
然后我们将使用此b代替:
for i in range(len(b)):
a=re.sub(r"\)[A-Z]",b[i],a,1)
print(a)
这将给出:
DIV([P([B([])]),P([]),B([])]),P([]),B([])
所以上面的整个代码如下:
import re
a="DIV([P([B([])])P([])B([])])P([])B([])"
b=re.findall(r"\)[A-Z]",a)
for i in range(len(b)):
b[i]=b[i][0]+","+b[i][1]
for i in range(len(b)):
a=re.sub(r"\)[A-Z]",b[i],a,1)
print(a)
P.S .:请仅分享无法使用的a的可能值以及您希望从中获得的最终结果。我将能够为此匹配它。