gpt4 book ai didi

python - 多行正则表达式匹配

转载 作者:行者123 更新时间:2023-11-28 22:56:12 26 4
gpt4 key购买 nike

我有一个看起来像这样的文件:

useless stuff

fruit: apple
fruit: banana

useless stuff

fruit: kiwi
fruit: orange
fruit: pear

useless stuff

这个想法是按照它们出现的顺序和分组来捕获所有的水果名称。对于上面的例子,输出必须是这样的:

[['apple', 'banana'], ['kiwi', 'orange', 'pear']]

我通过遍历多行正则表达式 '^fruit: (.+)$' 的所有匹配项并通过将水果名称添加到同一给定列表(如果出现发现它们的行彼此跟随。

但是,这对于在水果名称上进行替换是不切实际的(跟踪匹配开始和结束索引变得强制性),所以我更愿意在单个正则表达式中执行此操作。

我已经试过了:

re.findall(r'(?:^fruit: (.+)$\n)+', thetext, re.M)

但它只返回一行。

我哪里错了?

最佳答案

您不能在正则表达式中以这种方式进行“分组”,因为通常一个组只捕获其最新的匹配项。解决方法是按字面意思重复一组:

matches = re.findall(r'(?m)(?:^fruit: (.+)\n)(?:^fruit: (.+)\n)?(?:^fruit: (.+)\n)?', text)
# [('apple', 'banana', ''), ('kiwi', 'orange', 'pear')]

如果这适合您的任务(例如,不超过 5-6 组),您可以轻松地即时生成此类表达式。如果没有,唯一的选择是两次通过匹配(我猜这与您已经拥有的类似):

matches = [re.findall(': (.+)', x) 
for x in re.findall(r'(?m)((?:^fruit: .+\n)+)', text)]
# [['apple', 'banana'], ['kiwi', 'orange', 'pear']]

非标准(尚未)regex模块提供了一个有趣的方法,称为“捕获”。 m.captures(n) 返回一组的所有匹配项,而不仅仅是最新的匹配项,如 m.group(n) 所做的:

import regex
matches = [x.captures(2) for x in regex.finditer(r'(?m)((?:^fruit: (.+)\n)+)', text)]
# [['apple', 'banana'], ['kiwi', 'orange', 'pear']]

关于python - 多行正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15986631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com