regex - 使用正则表达式根据重复组用逗号划分子字符串
问题描述
这是一个编码练习。我应该使用 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([])
)。
解决方案
我确定我在这里不理解某些东西,但是如果是这种情况,为什么不只使用简单的:
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 的可能值,它不起作用以及您期望的最终结果。我将能够匹配它。
推荐阅读
- c - 传入函数参数的数组是否被视为按引用调用?
- node.js - nodejs 承诺从那时起返回值
- python - 在 python AWS lambda 中使用 aws 加密 SDK
- ios - GMSMarker 自定义图标未根据坐标出现。iOS - 斯威夫特 - 谷歌地图
- vhdl - 如何使用 VHDL 创建异或环形振荡器
- python - 通过 Python 与 Arduino 通信 C++ 程序
- angularjs - AngularJS 和 Firebase - 从数据库中获取特定值
- ios - iOS 中的键盘处理
- javascript - ReactJS - 如何更新嵌套和“正常”状态属性?
- php - 在我的函数解析错误中找到错误:语法错误,意外'}'