正则表达式返回除复合表达式之外的一切

时间:2016-05-25 18:14:32

标签: python regex

我正在尝试解析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
%

2 个答案:

答案 0 :(得分:2)

关于正则表达式的一些注释:(?![(].*[)])匹配未跟(的空格,除换行符之外的任何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)

答案 1 :(得分:1)

因为否定前瞻不用于否定整个正则表达式(意思是,它不用于匹配给定正则表达式的反对)。过去常常说,在文本中向前看是不可能匹配这个正则表达式。

一个更简单的例子,我们知道这用于匹配所有数字:

\d+

好吧,要匹配不是数字的所有内容,我们无法执行此操作:

(?!\d+)

因为那不是那样做的。这意味着,在当前的匹配位置,确保向前看,我们没有数字。 \d的实际否定有自己的字符类:

\D+

根据您的示例代码,您可以使用此正则表达式来匹配所有不是注释的内容:

^[^(]+

Try it