【问题标题】:Python Regex Matching Too MuchPython 正则表达式匹配太多
【发布时间】:2020-06-28 03:03:26
【问题描述】:

Regex101 测试者:https://regex101.com/r/Yfp311/2

我很难让以下正则表达式模式正常工作。对于下面的示例文本字符串,REF1 匹配整行,如果在行中找到“//[text]”,则忽略应该匹配的 可选REF2 组。

目前,正则表达式不承认 //[text] 并且错误地将整个文本匹配为 REF1。我假设这是贪婪匹配的一个特征..但是我没有成功实现非贪婪模式,并且前瞻/后视(似乎没有工作)。

任何帮助或指导将不胜感激...不确定我缺少什么,因为我认为我当前的正则表达式模式应该可以正常工作。如果我能澄清任何事情,请告诉我!谢谢!

^(?P<ID>[A-Z][A-Z0-9]{3})?(?P<REF1>.+)(//(?P<REF2>.+))?(\n?(?P<EXTRA>.+))?$

TEX1CNS0P5-AA//CAT-523-VID-00EOS-0
XUX PETER LAB RANDOM TEXT DM5.

TEX2BFTBSH9999SBRT2L
RATRACE201

TEX3GWS0P2-AA//D-14839048-99-3
THERE WAS 200 COALS IN HIS STOCKING.

预期匹配:

  • 字符串 1:
    • id: TEX1
    • ref1: CNS0P5-AA
    • ref2: CAT-523-VID-00EOS-0
    • 额外:XUX PETER LAB 随机文本 DM5。
  • 字符串 2:
    • id: TEX2
    • ref1: BFTBSH9999SBRT2L
    • ref2:(不匹配,因为“//”未出现在此文本中)
    • 额外:RATRACE201
  • 字符串 3:
    • id: TEX3
    • ref1: GWS0P2-AA
    • ref2: D-14839048-99-3
    • 额外:他的库存中有 200 块煤炭。

【问题讨论】:

  • 如果您的问题以您正在尝试做的事情的陈述开始,而不参考代码,然后为每个显示提供一个或多个示例(如果需要)进行说明,那么对于读者来说会容易得多想要的结果。然后才引入需要修复的代码。
  • @CarySwoveland 谢谢,以后我会尽量简洁的。

标签: python regex string regex-lookarounds regex-greedy


【解决方案1】:

^(?P&lt;ID&gt;[A-Z][A-Z0-9]{3})?(?P&lt;REF1&gt;[^/\n]+)(//(?P&lt;REF2&gt;.+))?(\n?(?P&lt;EXTRA&gt;.+))?$

我已经更新了。我想它现在通过了所需的案例:

https://regex101.com/r/Yfp311/3

原始实现的问题是REF1 匹配除行终止符之外的所有内容。所以它也匹配//

【讨论】:

  • 啊!非常感谢!因此,通过包含 (?P[^/\n]+),它看起来与这些字符不匹配,并且有效地正确匹配!!!谢谢!
【解决方案2】:

怎么样

^(?P<ID>[A-Z][A-Z0-9]{3})?(?P<REF1>[^/\n]+)(//(?P<REF2>.+))?(\n?(?P<EXTRA>.+))?$

?

我认为在这种情况下,手写解析器更容易实现。

【讨论】:

  • 能否请您解释一下为什么要推荐手写解析器?有什么好处让我可以理解? PS新的正则表达式效果很好!您能否解释一下我的问题/遗漏了什么?
【解决方案3】:

我最终发现了一个更理想的答案,因为当 REF1 文本包含单个“/”正斜杠时,提供的正则表达式模式会失败。

^(?P<ID>[A-Z][A-Z0-9]{3})?(?P<REF1>(?:(?!//).)+)(//(?P<REF2>.+))?(\n?(?P<EXTRA>.+))?$

例如 - https://regex101.com/r/Yfp311/4

TEX4POF OF 20/03/09//CAT342134832489
P/O:1600 PARK AVENUE

使用负前瞻正则表达式模式有助于解决这一差距。

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 2014-10-06
    • 2013-11-25
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2016-09-08
    相关资源
    最近更新 更多