如何用Python re.split将SVG路径坐标字符串拆分为嵌套列表?
解决SVG路径坐标拆分嵌套列表的问题
我知道你已经熬了好几个小时折腾这个问题,别慌,咱们一步步把这个SVG路径字符串拆成符合要求的嵌套列表。先说说你当前代码的问题:用re.split(r'[A-Za-z-]', points)会把负号(如果坐标带负数的话)也当成分隔符切掉,还会产生一堆空字符串,根本没法正确分组坐标。
正确的实现思路
咱们分两步来处理:
- 第一步:把整个路径按**绘制指令(M、c、s等)**拆成独立的路径段,每个段对应一个指令和它的坐标集合
- 第二步:把每个段里的坐标字符串拆成成对的(x,y)数值,再组合成嵌套列表
完整代码实现
import re points ="""M445,346c28.8,0,56,11.2,76.4,31.6C541.8,398,553,425.2,553,454s-11.2,56-31.6,76.4C501,550.8,473.8,562,445,562 s-56-11.2-76.4-31.6C348.2,510,337,482.8,337,454s11.2-56,31.6-76.4S416.2,346,445,346 M445,345c-60.2,0-109,48.8-109,109 s48.8,109,109,109s109-48.8,109-109S505.2,345,445,345L445,345z""" # 第一步:匹配每个指令和对应的坐标字符串 path_segments = re.findall(r'([A-Za-z])([^A-Za-z]+)', points) # 第二步:处理每个段的坐标,转换成嵌套列表 nested_points = [] for cmd, coords_str in path_segments: # 按逗号或空格分割坐标,过滤空字符串,转成float类型 coords = list(map(float, filter(None, re.split(r'[, ]', coords_str)))) # 每两个元素一组,组成(x,y)子列表 coord_pairs = [coords[i:i+2] for i in range(0, len(coords), 2)] # 把指令和坐标对一起存入,方便后续区分路径段(如果不需要指令,直接存coord_pairs即可) nested_points.append({ 'command': cmd, 'coordinates': coord_pairs }) # 如果你只需要纯坐标的嵌套列表(不带指令),可以用这行生成: # pure_coords = [pair for segment in nested_points for pair in segment['coordinates']] # 打印结果验证 for segment in nested_points: print(f"指令 {segment['command']}:") print(segment['coordinates'])
代码细节解释
- 正则匹配路径段:
re.findall(r'([A-Za-z])([^A-Za-z]+)', points)会把每个字母指令(比如M、c、S)和后面的所有非字母字符(也就是坐标部分)匹配出来,返回类似[('M', '445,346'), ('c', '28.8,0,56,11.2,76.4,31.6')]的元组列表 - 清理并转换坐标:用
re.split(r'[, ]', coords_str)按逗号或空格分割坐标,filter(None, ...)去掉分割后产生的空字符串(比如多个空格的情况),再转成float类型确保数值可用 - 分组坐标对:用切片
coords[i:i+2]每两个元素一组,得到(x,y)的子列表,最终形成嵌套结构
针对你输入的输出示例
比如第一个M指令对应的坐标会变成[[445.0, 346.0]],c指令对应的坐标会变成[[28.8, 0.0], [56.0, 11.2], [76.4, 31.6]],完全符合嵌套列表的要求。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

