【问题标题】:Python multi-line regex greedy groupPython多行正则表达式贪婪组
【发布时间】:2018-03-13 18:44:03
【问题描述】:

我正在尝试在 Python 中解析以下示例文本:

Foo 1
foo1Text

Bar 
bar1Text

Baz 
baz1Text

Foo 2
foo2Text

Bar 
bar2Text

Baz 
baz2Text

# and so on up to Foo/Bar/Baz N

现在,我使用的正则表达式是:

([\S ]+)(\n*)([\s\S]*?)Bar([\s\S]*?)Baz([\s\S]*?)

现在 - 我想做的是提取与foo/bar/baz 相关的文本。但是,由于正则表达式末尾的惰性限定符 ? 表达式停止并错过了 baz2text。相反,使其贪婪匹配作为最后一组的一部分的其他所有内容。

如果可能,我宁愿不使用数字限定符,并广泛匹配基于:

{title}
{stuff about title}

Bar
{stuff about Bar}

Baz
{stuff about Baz}

所以我可以遍历每个匹配项并相应地提取组。请注意,我没有围绕提取具体输出来表述这一点。我最感兴趣的是获取正则表达式“组”,因此它们代表:{title}{stuff about title}{stuff about bar}{stuff about Baz}

我正在与regex101 讨论是否可以确定正确的咒语,但无济于事。

这是很容易手动完成的问题之一。但那样我什么都学不会! :) 我很想知道我是否应该在这里使用一些更简洁的机制/策略。

非常感谢

【问题讨论】:

  • 不清楚输出应该是什么。
  • 本身并没有真正的输出。我更感兴趣的是让小组退出:{title}、{stuff about title}、{stuff about Bar} 和 {stuff about Baz}。将更新问题,以便更清楚。
  • 我不确定每个块应该停在哪里。请查看此演示regex101.com/r/b8PPoL/1
  • 我也开始这么想了。我可能问了一个不可能的问题。如何区分新的{title} 和来自{stuff about Baz} 的多行文本元素?没有鉴别器,就无法分辨。就我而言,这里有一个我无法透露的隐含层次结构,我相信我必须在这里使用它。无论如何,感谢您的投入!

标签: regex regex-greedy


【解决方案1】:

如果您知道FooBaz 之后的下一组,那么您需要的是 lookahead: ([\S ]+)(\n*)([\s\S]*?)Bar([\s\S]*?)Baz([\s\S]*?)(?=Foo).

Lookaheads 是零宽度断言,因此它确保匹配立即跟随但不改变当前位置。

【讨论】:

  • 这适用于像Foo 这样的固定名称,但不能使用任意标题。虽然感谢您对前瞻的参考。这是我没有考虑过的另一种看待它的方式。将在前瞻表达式中试验正则表达式。
猜你喜欢
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多