首页 > 解决方案 > 提取两个多行分隔符之间的内容并检查空值

问题描述

假设我有一个这样的输入文件:

#Backup TOC
boot.tar.gz    /boot/

#Filesystems
/boot               /dev/mapper/VolGroup-lv_root xfs

#Devices
/dev/disk/by-path/pci-0000:03:00.0-scsi-0:0:0:0-part1 PHY /dev/disk/by-path/pci-0000:03:00.0-scsi-0:0:0:0

#UnhandledFS
/var/
/var/log
/var/log/audit
/var/tmp

我想提取每个#header 之间的内容(最后一个#UnhandledFS 可以忽略),一旦提取,我必须检查是否有任何可用的条目。

下面的代码我用来提取两个#header 之间的内容。但它不会重复

lines = open("./input").readlines()
re.compile('#\w+(.*?)#\w+', re.DOTALL | re.M).findall(''.join(lines))

标签: python

解决方案


您的正则表达式的问题在于它消耗了“结束”#header,这导致它跳过#Filesystems并弄乱了您的匹配。

您需要的称为“前瞻” ——它是一种匹配模式而不消耗它的方法。

这是一个适合您的正则表达式:

re.compile(r'#[^\n]*\n([^#]*)(?=#)', re.DOTALL | re.M).findall(''.join(lines))

它还解决了匹配中包含带有空格的标题的问题,例如示例中的第一个标题:单词 TOC 将成为匹配的一部分。

但是,如果您想要对您的正则表达式进行最少的修复,这也将起作用(TOC 部分除外):

re.compile('#\w+(.*?)(?=#\w+)', re.DOTALL | re.M).findall(''.join(lines))

推荐阅读