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))
解决方案
您的正则表达式的问题在于它消耗了“结束”#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))
推荐阅读
- r - 在 R Shiny 中,如何对数据框的指定列求和并将结果输出到表中?
- python-3.x - 从字典中的前一个元素中减去列表的每个元素
- python - 如何从 google ads api 报告中检索数据(geo_performance_report)
- vba - 自定义函数,如 msgbox 函数
- python - ValueError:输入形状错误 (1, 2)
- r - 连年构建字链
- rust - 如何从 Tauri 调用 webview2 固定版本?
- c - printf 不打印存储在变量中的整数
- docker - 我可以运行另一个 docker 作为服务吗?
- python - 关于'utf-8'编解码器的UnicodeDecodeError无法在Python中解码字节0x96