捕获所有出现的模式,直到Python中第一个出现的单词

时间:2019-06-11 01:19:30

标签: python

我有一个包含以下数据的文件:

define host { 
......
..... {3,9}
}

define host {
.......
...... text
}

define host {
.......
....... {3}
}

我想使用python regex捕获所有主机定义,并将它们存储在列表中(例如['define host {....}', 'define host {.....}',。

re.findall('define\ +host[^}]*', cfg_file, re.Multiline|re.DOTALL)
re.finall('define\ +host.+?(?:define\ +host)', cfg_file,re.Multiline|re.DOTALL)

以上所有对我有用的方法都不存在,直到第一次出现单词而不是[^}]*-> [^word]*中的字符为止。

结果应该是其中包含所有主机定义的列表:

['define host {...{}..}', 'define host {...}', 'define host {...}']

2 个答案:

答案 0 :(得分:1)

对于主机中的{}级嵌套,可以使用:

re.findall(r'(define *host *{(({[^{}]*})|[^{}])*})', data)

答案 1 :(得分:1)

一个非常幼稚的解决方案是仅匹配从define host到文件中下一个define host的所有内容。这将不检查花括号,但是也没有匹配嵌套花括号的并发​​症。

define\s*host\s*((?!define\s*host).)*

但是,如果在合理的情况下define host会作为主机定义的一部分出现,则您可能需要查看除正则表达式之外的其他内容,因为它们不是解析嵌套结构的正确工具