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

捕获所有出现的模式,直到Python中第一个单词出现,python,Python,我有一个包含以下数据的文件: define host { ...... ..... {3,9} } define host { ....... ...... text } define host { ....... ....... {3} } 我想用python正则表达式捕获所有主机定义,并将它们存储在一个列表中(例如['define host{….}'、'define host{….}',) re.findall('define\ +host[^}]*', cfg_file, re.M

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

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

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

define host {
.......
....... {3}
}
我想用python正则表达式捕获所有主机定义,并将它们存储在一个列表中(例如
['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 {...}']

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

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

一个相当简单的解决方案是只匹配文件中从
define host
开始到下一个
define host
的所有内容。这不会检查花括号,但也不会导致匹配嵌套大括号的复杂性

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

但是,如果在某种合理的情况下,
define host
将显示为主机定义的一部分,则您可能必须查看除正则表达式以外的其他内容,因为它们不是解析嵌套结构的正确工具。

使用积极的前瞻。为什么结果应该是
host define
,而不是
定义主机
?但前瞻在文件末尾不匹配。您需要在正则表达式周围加引号。@Barmar,正向前瞻工作正常。仍然需要匹配上次出现的内容。谢谢。