如何从 python 正则表达式中排除特定字符串

sal*_*ane 5 python regex

我正在尝试解析/etc/mtab但排除/boot. 我认为也许非捕获组是可行的方法,但它并没有像我预期的那样工作。这是我构建的正则表达式:

proc = subprocess.Popen(["ssh", server, "cat", mtab],stdout = subprocess.PIPE)
for line in proc.stdout:
  fsMatch = re.search(r'([\w/:]+) (/([\w/:-]+)|(?:boot)) (nfs|ext3)', line)
  if fsMatch:
    print fsMatch.group(1,2,4)
Run Code Online (Sandbox Code Playgroud)

输出:

('/dev/sda1', '/boot', 'ext3')
('/dev/mapper/foo1', '/export/foo1', 'ext3')
('/dev/mapper/foo2', '/export/foo2', 'ext3')
('/dev/mapper/foo3', '/export/foo3', 'ext3')
('/dev/mapper/foo4', '/export/foo4', 'ext3')
('/dev/mapper/foo5', '/export/foo5', 'ext3')
('servernfs:/install', '/mnt', 'nfs')
Run Code Online (Sandbox Code Playgroud)

我非常有信心这|是错误的(显然更多的是错误的),但遇到了障碍。

我正在寻找所有匹配项,/[\w/:-]+但排除匹配项/boot

建议?

hob*_*obs 6

您需要使用负向后查找或负向前查找,如下所示,如下所示:

r'^(?!/boot).*$'
Run Code Online (Sandbox Code Playgroud)

如果您需要捕获“servernfs:”而不是“servernfs:/boot”,则需要撒上一点“|” 和顶部某处的“([az]+:)”(在“^”之后)


Bur*_*lid 1

只需排除该行:

for line in proc.stdout:
  if 'boot' not in line:
      # the rest
Run Code Online (Sandbox Code Playgroud)

但是,由于mtab是按空格分隔的,因此您可以使用split

>>> with open('foo.txt') as f:
...     lines = [line.split(' ') for line in f if 'boot' not in line]
...
Run Code Online (Sandbox Code Playgroud)