首页 > 解决方案 > 正则表达式获取两个单词之间的所有内容 {}

问题描述

我正在尝试解析一个 rpt 文件并在模式 [SAMPLE] 之后的 {} 之间提取所有内容,直到下次出现此模式。所以它将是 [SAMPLE] {这是我想要的数据} [SAMPLE]。也有可能一个文件中只包含一个 [SAMPLE],因此可以有一个或多个 [SAMPLE] 部分。

该文件看起来像这样:

[SAMPLE]
{
[MS]
{
lots of text...
;Mass   % BPI
238.85  0.943
247.64  0.984
378.65  0.990
...
}
[CHROMATOGRAM]
{
lots of text...
}
lots of text...
[MS]
{
;Mass   % BPI
238.85  0.943
247.64  0.984
378.65  0.990
...
}
lots of text...
{
;Mass   % BPI
238.85  0.943
247.64  0.984
378.65  0.990
...
}
}
[SAMPLE]
{
[MS]
{
lots of text
;Mass   % BPI
238.85  0.943
247.64  0.984
378.65  0.990
...
}
[CHROMATOGRAM]
{
lots of text...
}
lots of text...
[MS]
{
;Mass   % BPI
238.85  0.943
247.64  0.984
378.65  0.990
...
}
lots of text...
{
;Mass   % BPI
238.85  0.943
247.64  0.984
378.65  0.990
...
}
}

我尝试使用这种模式:

\[SAMPLE\]\s*{([^{}]+)} 

但这只给出了 {} 之间的第一部分

在 [SAMPLE] 部分之间有许多打开和关闭的 {}。有谁知道我可以使用什么正则表达式来获取数据?

标签: regexpython-3.x

解决方案


您可以使用

list_of_results = re.findall(r'\[SAMPLE][^[]*(?:\[(?!SAMPLE])[^[]*)*', text)

在线查看正则表达式演示Python 演示

正则表达式基本上匹配任何从字符串开始[SAMPLE]到最近出现[SAMPLE]或结尾的子字符串。

细节

  • \[SAMPLE]- 一个[SAMPLE]子串
  • [^[]*- 0 个或更多字符[
  • (?:\[(?!SAMPLE])[^[]*)* - 零个或多个序列
    • \[(?!SAMPLE])-[没有立即跟在后面的字符SAMPLE]
    • [^[]*- 0 个或更多字符[

推荐阅读