Regex返回除复合表达式以外的所有内容

2024-09-29 19:33:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

%
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
%

Tags: 程序版本内容地址方式模式positiongcode
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)

因为一个否定的lookahead不用于否定一个完整的regex(也就是说,它不用于匹配给定regex是什么的反义词)。在这一点上,我们习惯于说,在文本中展望未来是不可能匹配这个正则表达式的。你知道吗

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

\d+

好吧,为了匹配所有不是数字的东西,我们不能这样做:

(?!\d+)

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

\D+

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

^[^(]+

Try it

相关问题 更多 >

    热门问题