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

2024-10-05 14:32:08 发布

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

我试图解析/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)

输出:

('/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')

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

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

建议?


Tags: devstdoutlineexportprocsubprocessbootmapper
2条回答

您需要使用负lookbehind或负lookahead,如here所述,并提供以下提示:

r'^(?!/boot).*$'

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

只需排除行:

for line in proc.stdout:
  if 'boot' not in line:
      # the rest

但是,由于mtab是用空格分隔的,所以您可以只使用split

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

相关问题 更多 >