Skip to main content
 首页 » 编程设计

python之正则表达式返回除复合表达式之外的所有内容

2024年08月22日41zhengyun_ustc

我正在尝试解析一个 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)