例如,我有一个用Fanuc g代码格式编写的g代码,包括Macro-B(更多信息here)
#101 = 2.0 (first variable)
#102 = 0.1 (second variable)
#103 = [#101 + #102 * 3] (third variable using simple arithmetic)
G01 X#101 Y#103 F0.1
应转换为:
G01 X1.0 Y2.3 F0.1
要更改的内容:
(#\d+)\s*=\s*(-?\d*\.\d+|\d+\.\d*)
+
内的-
,*
,/
和[...]
: (#\d+)\s*=\s*\[(#\d+|(-?\d*\.\d+|\d+\.\d*))(\s*[+\-*/]\s*(#\d+|(-?\d*\.\d+|\d+\.\d*|\d+)))*\]
(...)
可以忽略或删除。如果您能帮助我知道如何在Python中执行此操作以及上面的正则表达式正确,我将不胜感激。感谢您的提前支持。
P.S.1。不幸的是,我找不到g代码的受防护代码块的语法突出显示
P.S.2。在将浮点数更改为字符串时,应考虑Python浮点处理的问题。我做了这个功能来解决这个问题:
def f32str(inputFloat):
"""
This function converts a Python float to a string with 3 decimals
"""
return str(f"{inputFloat:.3f}")
答案 0 :(得分:0)
好的,我刮了一段代码来完成这项工作。假设gcode
是从Fanuc G代码读取的多行字符串:
import re
import os
def f32str(inputFloat):
return str(f"{inputFloat:.3f}")
gcode = re.sub(r"\(.*?\)", "", gcode)
flag = len(re.findall(r"#\d+", gcode))
while 0 < flag:
cases = re.findall(r"((#\d+)\s*=\s*([-+]?\s*(\d*\.\d+|\d+\.?\d*)))", gcode)
for case in cases:
gcode = gcode.replace(case[0], "")
gcode = gcode.replace(case[0], case[1])
cases = re.findall(r"(\[(\s*[+-]?\s*(\d+(\.\d*)?|\d*\.\d+)(\s*[-+*\/]\s*[+-]?\s*(\d+(\.\d*)?|\d*\.\d+)\s*)*)\])", gcode)
for case in cases:
gcode = gcode.replace(case[0], f32str(eval(case[1])))
flag = len(re.findall(r"#\d+", gcode))
gcode = os.linesep.join([s for s in gcode.splitlines() if s.strip()])
这可能是最糟糕的方法,应该有更有效的实现。我将剩下的交给Python专家。