You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中移除SVG文件中特定匹配规则的M字符?

解决Python regex模块无法移除SVG中特定M字符的问题

看起来你的正则在测试工具里能正常工作,但到Python里就失效了,大概率是空白字符匹配不严谨或者不必要的flags导致的。我来帮你排查并解决这个问题:

问题根源

你的原正则L([0-9]+,[0-9]+) \KM\1里用了单个空格 来匹配L和M之间的分隔,但SVG路径数据中,指令之间的分隔可能是多个空格、换行符或者制表符,而不是严格的单个空格。这就导致你的正则在实际SVG文件中匹配不到目标内容,自然无法完成替换。

另外,你添加的regex.M(多行模式)在这里完全没必要——多行模式只会影响^和$的匹配范围,你的正则里并没有用到这两个锚点,所以这个flags不会帮到你,反而可能带来不必要的干扰。

解决方案

方案1:优化正则,匹配任意空白字符

修改正则中的单个空格为\s+(匹配任意数量的空白字符,包括空格、换行、制表符),同时去掉不必要的flags:

import regex

with open('test-mjlr.svg', 'r') as svg:
    data = svg.read()

# 用\s+匹配任意空白字符,确保覆盖SVG中所有可能的分隔情况
processed_data = regex.sub(r'L([0-9]+,[0-9]+)\s+\KM\1', '', data)
print(processed_data)

方案2:用捕获组替代\K(更直观)

如果你对\K的用法不太熟悉,也可以用捕获组来实现相同效果,逻辑更清晰:

import regex

with open('test-mjlr.svg', 'r') as svg:
    data = svg.read()

# 捕获L和其后的数字对,替换时只保留这部分,去掉后面的M和重复数字对
processed_data = regex.sub(r'(L([0-9]+,[0-9]+))\s+M\2', r'\1', data)
print(processed_data)

验证匹配情况

如果你不确定是否真的匹配到了目标内容,可以先添加一段代码检查匹配结果:

matches = list(regex.finditer(r'L([0-9]+,[0-9]+)\s+M\1', data))
print(f"找到 {len(matches)} 个符合条件的匹配项")
for match in matches:
    print(f"匹配内容:{match.group()}")

如果输出的匹配数量为0,那说明你的SVG文件中可能存在其他格式问题(比如数字包含小数点,这时候需要把正则里的[0-9]+改成[0-9.]+),你可以根据实际情况调整正则。

内容的提问来源于stack exchange,提问作者BigBoy1337

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:00:14