如何在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
相关产品推荐
相关产品推荐

