Python 多行正则表达式贪心组
Python multi-line regex greedy group
我正在尝试解析 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}
所以我可能会遍历每个匹配项并相应地提取组。请注意,我没有围绕提取具体输出来表达这一点。我最感兴趣的是获取正则表达式 'groups' 所以它们代表:{title}
、{stuff about title}
、{stuff about bar}
、{stuff about Baz}
我在 regex101 周围徘徊,想看看我是否能确定正确的咒语,但无济于事。
这是一个很容易手动解决的问题。但那样我就什么也学不到了! :) 我很想知道我是否应该在这里使用一些更简洁的机制/策略。
非常感谢
如果您知道 Foo
是 Baz
之后的下一组,那么您需要的是
lookahead: ([\S ]+)(\n*)([\s\S]*?)Bar([\s\S]*?)Baz([\s\S]*?)(?=Foo)
.
前瞻是 zero-width 断言,因此它确保匹配紧随其后但不会更改当前位置。
我正在尝试解析 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}
所以我可能会遍历每个匹配项并相应地提取组。请注意,我没有围绕提取具体输出来表达这一点。我最感兴趣的是获取正则表达式 'groups' 所以它们代表:{title}
、{stuff about title}
、{stuff about bar}
、{stuff about Baz}
我在 regex101 周围徘徊,想看看我是否能确定正确的咒语,但无济于事。
这是一个很容易手动解决的问题。但那样我就什么也学不到了! :) 我很想知道我是否应该在这里使用一些更简洁的机制/策略。
非常感谢
如果您知道 Foo
是 Baz
之后的下一组,那么您需要的是
lookahead: ([\S ]+)(\n*)([\s\S]*?)Bar([\s\S]*?)Baz([\s\S]*?)(?=Foo)
.
前瞻是 zero-width 断言,因此它确保匹配紧随其后但不会更改当前位置。