使用正则表达式基于重复组将逗号分隔子字符串

时间:2018-07-21 17:17:20

标签: regex python-3.x

这是一个编码练习。我应该使用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([]))。

1 个答案:

答案 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.findallre.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的可能值以及您希望从中获得的最终结果。我将能够为此匹配它。