首页 > 解决方案 > 使用正则表达式根据重复组用逗号划分子字符串

问题描述

这是一个编码练习。我应该使用 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([])])。如果没有封闭标签(如 so <p></p><b></b>),那么当它们被转换时,它们之间不带逗号( as such P([])B([]))。

标签: regexpython-3.x

解决方案


我确定我在这里不理解某些东西,但是如果是这种情况,为什么不只使用简单的:

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

首先,我们将在 a 中找到我们想要替换的所有内容:

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)

PS:请分享 a 的可能值,它不起作用以及您期望的最终结果。我将能够匹配它。


推荐阅读