1

我想匹配以下输入。如何在不使用多行字符串的情况下匹配一个组一定次数?像 (^(\d+) (.+)$){3}) 之类的东西(但这不起作用)。

sample_string = """Breakpoint 12 reached 
         90  good morning
     91  this is cool
     92  this is bananas
     """
pattern_for_continue = re.compile("""Breakpoint \s (\d+) \s reached \s (.+)$
                                 ^(\d+)\s+  (.+)\n
                                 ^(\d+)\s+  (.+)\n
                                 ^(\d+)\s+  (.+)\n
                                  """, re.M|re.VERBOSE)
matchobj = pattern_for_continue.match(sample_string)
    print matchobj.group(0)
4

2 回答 2

3

您的表达和样本存在一系列问题:

  • 您使用 VERBOSE 会使所有空格都不匹配,因此第一行数字周围的空格也会被忽略。\s用or替换空格[ ](后者仅匹配文字空格,前者也匹配换行符和制表符)。

  • 您的输入样本在每行的数字前都有空格,但您的示例模式要求数字位于行首。允许该空格或修复您的示例输入。

  • 最大的问题是重复组内的捕获组(因此(\d+)在最后一个较大的组内{3})仅捕获最后一个匹配项。你会得到92and this is bananas,而不是前两条匹配的行。

为了克服这一切,您必须明确地为三行重复该模式。您可以使用 Python 来实现该重复:

linepattern =  r'[ ]* (\d+) [ ]+ ([^\n]+)\n'

pattern_for_continue = re.compile(r"""
    Breakpoint [ ]+ (\d+) [ ]+ reached [ ]+ ([^\n]*?)\n
    {}
""".format(linepattern * 3), re.MULTILINE|re.VERBOSE)

其中,对于您的示例输入,返回:

>>> pattern_for_continue.match(sample_string).groups()
('12', '', '90', 'hey this is a great line', '91', 'this is cool too', '92', 'this is bananas')

如果您真的不想在 3 个额外行上的数字之前匹配空格,您可以[ ]*linepattern.

于 2013-03-18T17:55:33.357 回答
1

代码

你需要更多这样的东西:

import re

sample_string = """Breakpoint 12 reached 
90  hey this is a great line
91  this is cool too
92  this is bananas
"""
pattern_for_continue = re.compile(r"""
    Breakpoint\s+(\d+)\s+reached\s+\n
    (\d+)  ([^\n]+?)\n
    (\d+)  ([^\n]+?)\n
    (\d+)  ([^\n]+?)\n
""", re.MULTILINE|re.VERBOSE)
matchobj = pattern_for_continue.match(sample_string)

for i in range(1, 8):
    print i, matchobj.group(i)
print "Entire match:"
print matchobj.group(0)

结果

1 12
2 90
3   hey this is a great line
4 91
5   this is cool too
6 92
7   this is bananas
Entire match:
0 Breakpoint 12 reached 
90  hey this is a great line
91  this is cool too
92  this is bananas

原因

  • re.VERBOSE 在您的正则表达式中需要明确的空格。我通过左对齐多行字符串中的数据来部分解决此问题。我认为这是合理的,因为您可能在实际代码中没有这个;它可能是在多行字符串中编辑的产物。

  • 您需要替换$\n.

  • 你需要非贪婪匹配

于 2013-03-18T17:43:28.890 回答