使用python中的正则表达式解析与svg相关的字符串

我想解析svg的path元素内的d属性命令。我想以一种有效的方式做到这一点。因此,我决定使用正则表达式函数来避免使用多个循环。

What I want to achieve is to put the command letter along with its numeric values in a tuple and store all those tuples in a list e.g. [('M', '3', '18'), ('h', '10'), ...]

Depending on the command letter there can be one to six numeric values following. These numeric value can have a dot ('.45') or a minus ('-3') or both in it ('-.55'). And there are not always spaces seperating them. e.g. 'c -.55.45 0 1 '.

我的方法:

这是我到目前为止尝试过的。我试图用re.findall方法将它们分开。但是之后,我不得不将它们附加一个额外的循环,并且那些带有点的连接数字值仍然连接。此外,我想将replace方法集成到findall模式中。

# Just an extract of a d command
d = 'M20 3H4c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16'   
commands = re.findall("[mMzZlLhHvVcCsSqGtTaA]|[0-99\-.]+", d.replace("-", " -"))

#output: ['M', '20', '3', 'H', '4', 'c', '-.55', '0', '-1', '.45', '-1', '1', 'v', '6', 'c', '0', '.55.45', '1', '1', '1', 'h', '16']

#goal: [('M', '20', '3'), ('H', '4'), ('c', '-.55', '0', '-1', '.45', '-1', '1'), ('v', '6'), ('c', '0', '.55', '.45', '1', '1', '1'), ('h', '16')]

那些虚线连接的数值似乎很容易。我只是将它们分开。但这是不可能的,因为我的值可能为“ 1.55”。但是,此值与其他值之间用空格分隔(“ .55 1.45”)。由于我在使用这些正则表达式模式时遇到了困难,因此如果有人有解决方案,或者至少可以指导我朝正确的方向发展,那将是非常棒的。

如果我错过了什么,或者您需要更多信息,请告诉我,我会提供。先感谢您!