3D打印Gcode解析:Python正则匹配含/不含F参数的挤出行及参数提取
解析3D打印Gcode挤出动作的正则方案
匹配带/不带F参数的挤出行
针对Gcode中G1指令的挤出动作(必须包含E参数,X/Y/F可选),可以用这个正则表达式一次性覆盖两种场景:
^G1\s+(?:X[+-]?\d+(?:\.\d+)?\s+)?(?:Y[+-]?\d+(?:\.\d+)?\s+)?E[+-]?\d+(?:\.\d+)?\s*(?:F[+-]?\d+(?:\.\d+)?\s*)?$
正则拆解
^G1\s+:锁定行首的G1直线移动指令,允许后续空白字符(?:X[+-]?\d+(?:\.\d+)?\s+)?:可选的X参数,支持正负整数/浮点数,用非捕获组避免额外分组干扰(?:Y[+-]?\d+(?:\.\d+)?\s+)?:同理,可选的Y参数E[+-]?\d+(?:\.\d+)?:必须存在的E挤出量参数,支持正负值(回退动作也属于挤出相关逻辑)\s*(?:F[+-]?\d+(?:\.\d+)?\s*)?$:可选的F进给速度参数,前后允许空白,匹配到行尾
这个正则能覆盖的典型行示例:
- 带F的完整挤出:
G1 X10.5 Y-5 E2.3 F1200 - 不带F的挤出:
G1 X-3 E1.8 - 仅E和F的动作:
G1 E0.5 F900
提取X参数的数值
如果要单独提取X的数值,只需把X参数的数值部分改成捕获组,调整后的正则:
^G1\s+(?:X([+-]?\d+(?:\.\d+)?)\s+)?(?:Y[+-]?\d+(?:\.\d+)?\s+)?E[+-]?\d+(?:\.\d+)?\s*(?:F[+-]?\d+(?:\.\d+)?\s*)?$
以Python为例,提取逻辑如下:
import re # 示例Gcode行 gcode_line = "G1 X15.2 Y7 E3.1 F1500" # 带捕获组的正则 pattern = r"^G1\s+(?:X([+-]?\d+(?:\.\d+)?)\s+)?(?:Y[+-]?\d+(?:\.\d+)?\s+)?E[+-]?\d+(?:\.\d+)?\s*(?:F[+-]?\d+(?:\.\d+)?\s*)?$" match_result = re.match(pattern, gcode_line) if match_result: x_num_str = match_result.group(1) if x_num_str: # 判断X参数是否存在 x_value = float(x_num_str) print(f"提取到X参数值:{x_value}")
额外优化:兼容注释行
如果你的Gcode行末尾带有注释(以;开头),可以在正则末尾加上(?:;.*)?来忽略注释内容:
^G1\s+(?:X([+-]?\d+(?:\.\d+)?)\s+)?(?:Y[+-]?\d+(?:\.\d+)?\s+)?E[+-]?\d+(?:\.\d+)?\s*(?:F[+-]?\d+(?:\.\d+)?\s*)?(?:;.*)?$
内容的提问来源于stack exchange,提问作者GregValiant
相关产品推荐
相关产品推荐

