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
相关产品推荐
相关产品推荐

