You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则提取rpt文件中[SAMPLE]区块内的嵌套{}内容?

解决嵌套大括号的[SAMPLE]区块提取问题

你遇到的这个问题太常见了——普通正则里的[^{}]+只能匹配完全不含大括号的片段,但你的[SAMPLE]区块里有多层嵌套的{}结构,这种情况下必须用平衡组正则来处理,它能精准识别成对的大括号,不管嵌套多少层都能正确匹配。

适用的正则表达式

针对你的场景,这个正则就能搞定:

\[SAMPLE\]\s*({(?:[^{}]|(?R))*})

正则结构拆解

我给你拆解下每个部分的作用:

  • \[SAMPLE\]:匹配字面量[SAMPLE],方括号转义是因为它在正则里是特殊字符
  • \s*:匹配0个或多个空白字符(包括空格、换行、制表符等),兼容[SAMPLE]和大括号之间的任意空白
  • ({(?:[^{}]|(?R))*}):这是核心的平衡组逻辑:
    • {:匹配区块开头的左大括号
    • (?:[^{}]|(?R))*:非捕获组,匹配两种情况:要么是非大括号的任意字符,要么是递归匹配整个正则的内容(也就是处理嵌套的{...}结构)
    • }:匹配区块结尾的右大括号

代码示例(以Python为例)

如果用Python处理你的rpt文件,示例代码如下:

import re

# 模拟你的rpt文件内容
rpt_content = """[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 ... } }"""

# 定义正则模式
pattern = r'\[SAMPLE\]\s*({(?:[^{}]|(?R))*})'
# 注意加上re.DOTALL,让.能匹配换行符(你的区块大概率跨多行)
matches = re.findall(pattern, rpt_content, re.DOTALL)

# 输出每个匹配到的[SAMPLE]区块内容
for idx, sample_block in enumerate(matches, 1):
    print(f"=== 第{idx}个[SAMPLE]区块内容 ===")
    print(sample_block)

注意事项

  1. 正则引擎兼容性:(?R)递归语法不是所有引擎都支持,比如JavaScript就不支持。如果你的运行环境是JS,可能需要手动计数大括号层级来实现匹配;但Python、PHP、Perl等主流后端语言都支持这个语法。
  2. 大括号完整性:要确保你的rpt文件里的大括号都是成对闭合的,如果有未闭合的情况,正则可能会错误匹配到文件末尾。
  3. 跨多行匹配:一定要加上对应引擎的“单行模式”参数(比如Python的re.DOTALL),否则正则会把换行符当成终止符,匹配不完整。

内容的提问来源于stack exchange,提问作者bimarian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:43:01