让我们说我有一个这样的输入文件:
#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))
答案 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))