Python 正则表达式匹配太多

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:

    • 编号:TEX1

    • 参考 1:CNS0P5-AA

    • 参考 2:CAT-523-VID-00EOS-0

    • 额外:XUX PETER LAB 随机文本 DM5。

  • 字符串 2:

    • 编号:TEX2

    • 参考 1:BFTBSH9999SBRT2L

    • ref2:(不匹配,因为“//”没有出现在这个文本中)

    • 附加:RA TRACE201

  • 字符串 3:

    • 编号:TEX3

    • 参考 1:GWS0P2-AA

    • 参考 2:D-14839048-99-3

    • 额外:他的袜子里有 200 块煤。


富国沪深
浏览 123回答 3
3回答

犯罪嫌疑人X

^(?P<ID>[A-Z][A-Z0-9]{3})?(?P<REF1>[^/\n]+)(//(?P<REF2>.+))?(\n?(?P<EXTRA>.+))?$我已经更新了它。我想它现在通过了所需的案例:https://regex101.com/r/Yfp311/3原始实现的问题是REF1匹配除行终止符之外的所有内容。所以它也匹配//。

慕姐8265434

怎么样^(?P<ID>[A-Z][A-Z0-9]{3})?(?P<REF1>[^/\n]+)(//(?P<REF2>.+))?(\n?(?P<EXTRA>.+))?$?我认为在这种情况下手写解析器更容易实现。

Helenr

我最终发现了一个更理想的答案,因为当 REF1 文本包含单个“/”正斜杠时,提供的正则表达式模式会失败。^(?P<ID>[A-Z][A-Z0-9]{3})?(?P<REF1>(?:(?!//).)+)(//(?P<REF2>.+))?(\n?(?P<EXTRA>.+))?$例如 -&nbsp;https://regex101.com/r/Yfp311/4TEX4POF&nbsp;OF&nbsp;20/03/09//CAT342134832489 P/O:1600&nbsp;PARK&nbsp;AVENUE使用负前瞻正则表达式模式有助于解决这一差距。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python