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

Python正则表达式如何捕获多行中以@@@@开头的分组?

如何用Python正则捕获连续的以@@@@开头的分组?

没问题!我来帮你搞定这个正则分组的问题。先理清楚你的需求:你要把一段文本里连续的、以@@@@开头的行归为同一个分组,而不是每一行单独成组,对吧?

先看你的原始文本和期望结果:

原始文本:

@@@@ foo foo
@@@@ bar bar
bla bla bla
@@@@ one two test
@@@@ test one two
bla bla bla bla

期望结果:

group1: '@@@@ foo foo\n@@@@ bar bar\n'
group2: '@@@@ one two test\n@@@@ test one two'

你之前用(@@@@ [A-Za-z]+)得到4个分组,是因为这个正则只会匹配单个@@@@开头的片段,没有处理“连续行”的逻辑,自然会把每一行拆成独立分组。下面是正确的解决方法:


1. 核心思路:匹配连续的@@@@行

我们需要让正则识别“从@@@@开始,直到遇到非@@@@开头的行或者文本结束”的这段内容,把它们打包成一个分组。

2. 具体实现代码

import re

# 你的目标文本
text = """@@@@ foo foo
@@@@ bar bar
bla bla bla
@@@@ one two test
@@@@ test one two
bla bla bla bla"""

# 正则表达式:匹配连续的@@@@开头的内容
pattern = r'(@@@@.*?(?=\n(?!@@@@)|$))'
# 开启DOTALL模式,让.能匹配换行符
matches = re.findall(pattern, text, re.DOTALL)

# 输出结果
for idx, group in enumerate(matches, 1):
    print(f'group{idx}: {repr(group)}')

3. 正则表达式解释

  • @@@@:精准匹配开头的标识
  • .*?:非贪婪匹配任意字符(包括换行,因为开启了re.DOTALL),避免过度匹配到后面的内容
  • (?=\n(?!@@@@)|$):正向预查(不会消耗字符),用来判断停止匹配的条件:
    • \n(?!@@@@):下一行不是以@@@@开头
    • |$:或者已经到文本结尾

4. 运行结果

执行代码后会输出:

group1: '@@@@ foo foo\n@@@@ bar bar\n'
group2: '@@@@ one two test\n@@@@ test one two\n'

完全符合你的期望!


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:15:32