我正在尝试解析一个gcode程序以返回除包含()的注释之外的所有内容。非否定版本的工作方式是:[[(]。* [)])仅返回注释。为什么以下模式不返回除注释之外的所有内容?:

(?!([(].*[)]))

%
O1000
T1 M6
G0 G90 G40 G21 G17 G94 G80
G54 X-75 Y-25 S500 M3  (Start Point)
G43 Z100 H1
Z5
G1 Z-20 F100
X-50 M8               (Position 1)
Y0                    (Position 2)
X0 Y50                (Position 3)
X50 Y0                (Position 4)
X0 Y-50               (Position 5)
X-50 Y0               (Position 6)
Y25                   (Position 7)
X-75                  (Position 8)
G0 Z100
M30
%

最佳答案

关于正则表达式的几点注意事项:(?![(].*[)])匹配一个空的空格,该空格后面没有(,除了换行符以外的任何0+字符,直到该行的最后一个)。因此,您只有零长度的匹配项-难怪您什么都没有得到。

如果注释是一行中的最后一个(...),并且注释中不能包含括号,请使用re.sub

r'(?m)\s*\([^()]*\)[ \t]*$'


请参见the regex demo。替换为空字符串。

图案细节:


\s*-零个或多个空格
\(-开头(
[^()]*-除()以外的零个或多个字符
\)-结尾)
[ \t]*-零个或多个空格或制表符(可以替换为[^\S\r\n]
$-行尾(因为使用了(?m)(= re.MULTILINE))。


Python demo

import re
p = re.compile(r'\s*\([^()]*\)[ \t]*$', re.MULTILINE)
s = "%\nO1000\nT1 M6\nG0 G90 G40 G21 G17 G94 G80\nG54 X-75 Y-25 S500 M3  (Start Point)\nG43 Z100 H1\nZ5\nG1 Z-20 F100\nX-50 M8               (Position 1)\nY0                    (Position 2)\nX0 Y50                (Position 3)\nX50 Y0                (Position 4)\nX0 Y-50               (Position 5)\nX-50 Y0               (Position 6)\nY25                   (Position 7)\nX-75                  (Position 8)\nG0 Z100\nM30\n%"
result = p.sub("", s)
print(result)

关于python - 正则表达式返回除复合表达式之外的所有内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37444764/

10-10 20:19