Python re.finditer match.groups()不包含match中的所有组

发布于 2021-01-29 15:03:56

我正在尝试在Python中使用正则表达式来查找和打印来自多行搜索的所有匹配行。我正在搜索的文本可能具有以下示例结构:

AAA级
ABC1
ABC2
ABC3
AAA级
ABC1
ABC2
ABC3
ABC4
美国广播公司
AAA级
ABC1
AAA级

我想从中检索至少发生一次并以 AAA* 开头的 **ABC 。 ****

问题是,尽管小组正在抓住我想要的:

match = <_sre.SRE_Match object; span=(19, 38), match='AAA\nABC2\nABC3\nABC4\n'>

…我只能访问该组的最后一个匹配项:

match groups = ('AAA\n', 'ABC4\n')

下面是用于此问题的示例代码。

#! python
import sys
import re
import os

string = "AAA\nABC1\nABC2\nABC3\nAAA\nABC1\nABC2\nABC3\nABC4\nABC\nAAA\nABC1\nAAA\n"
print(string)

p_MATCHES = []
p_MATCHES.append( (re.compile('(AAA\n)(ABC[0-9]\n){1,}')) ) #   
matches = re.finditer(p_MATCHES[0],string)

for match in matches:
    strout = ''
    gr_iter=0
    print("match = "+str(match))
    print("match groups = "+str(match.groups()))
    for group in match.groups():
    gr_iter+=1
    sys.stdout.write("TEST GROUP:"+str(gr_iter)+"\t"+group) # test output
    if group is not None:
        if group != '':
            strout+= '"'+group.replace("\n","",1)+'"'+'\n'
sys.stdout.write("\nCOMPLETE RESULT:\n"+strout+"====\n")
关注者
0
被浏览
94
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是您的正则表达式:

    (AAA\r\n)(ABC[0-9]\r\n){1,}
    

    正则表达式可视化

    Debuggex演示

    您的目标是捕获紧随其后的 所有
    。如您在此Debuggex演示中所见,所有s确实都被匹配了(它们以黄色突出显示)。但是,由于只有“正在重复的内容”部分ABC#``AAA``ABC#

    ABC[0-9]\r\n
    

    捕获(在括号内)及其量词

    {1,}
    

    未被捕获,因此将导致 除最后一场 比赛 之外的 所有比赛 被丢弃。要获取它们,还必须捕获量词:

    AAA\r\n((?:ABC[0-9]\r\n){1,})
    

    正则表达式可视化

    Debuggex演示

    我已将“正在重复的内容”部分(ABC[0-9]\r\n)放入一个非捕获组。(AAA由于您似乎不需要它,我也已停止捕获它。)

    捕获的文本可以在换行符上进行拆分,并根据需要提供所有内容。

    (请注意,\n它本身在Debuggex中不起作用。它需要\r\n。)


    这是一种解决方法。没有太多的正则表达式功能可以通过重复捕获(哪些捕获?)进行迭代。一种更普通的方法是遍历并 处理
    找到的每个匹配项。这是来自Java的示例:

       import java.util.regex.*;
    
    public class RepeatingCaptureGroupsDemo {
       public static void main(String[] args) {
          String input = "I have a cat, but I like my dog better.";
    
          Pattern p = Pattern.compile("(mouse|cat|dog|wolf|bear|human)");
          Matcher m = p.matcher(input);
    
          while (m.find()) {
             System.out.println(m.group());
          }
       }
    }
    

    输出:

    cat
    dog
    

    (摘自 http://ocpsoft.org/opensource/guide-to-regular-expressions-in-java-
    part-1/
    ,大约减少了1/4)


    请考虑将“堆栈溢出正则表达式”
    FAQ
    标记为书签,以备将来参考。这个答案中的链接来自它。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看