Python芬代尔匹配组()不包含匹配项中的所有组

2024-10-01 09:21:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

AAA
ABC1
ABC2
ABC3
AAA
ABC1
ABC2
ABC3
ABC4
ABC
AAA
ABC1
AAA

我想从中检索至少出现一次并以AAA开头的ABC*。在

问题是,尽管团队抓住了我想要的:

^{pr2}$

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

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")

Tags: importrestringmatchsysgroupgroupsabc
1条回答
网友
1楼 · 发布于 2024-10-01 09:21:47

这是您的正则表达式:

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

{1美元^

Debuggex Demo

您的目标是捕获紧接着AAA的所有所有ABC#。正如您在这个Debuggex演示中看到的,所有的ABC#确实是匹配的(它们以黄色突出显示)。但是,因为只有“被重复的内容”部分

^{pr2}$

captured(在括号内),它的quantifier

{1,}

因此,除了最后一个匹配项之外的所有匹配项都将被丢弃。要获取它们,还必须捕获量词:

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

Regular expression visualization

Debuggex Demo

我已经将“正在重复的内容”部分(ABC[0-9]\r\n)放入non-capturing group。(我还停止了捕捉AAA,因为您似乎不需要它。)

捕获的文本可以在换行符上拆分,并将按您的意愿提供所有片段。在

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


这是一个解决办法。很少有正则表达式风格提供迭代重复捕获的能力(哪些是…?)。一种更正常的方法是循环遍历并处理每个匹配项。下面是一个来自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)


请考虑为Stack Overflow Regular Expressions FAQ添加书签以备将来参考。这个答案中的联系来自于它。在

相关问题 更多 >