提取两个多行定界符之间的内容并检查空值

时间:2018-12-07 07:28:26

标签: python

让我们说我有一个这样的输入文件:

#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))

1 个答案:

答案 0 :(得分:0)

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

您所需要的称为"lookahead"-这是一种无需使用模式即可匹配模式的方法。

以下是适用于您的正则表达式:

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