为了账号安全,请及时绑定邮箱和手机立即绑定

Python 正则表达式匹配太多

Python 正则表达式匹配太多

富国沪深 2023-02-07 10:46:30
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-0XUX PETER LAB RANDOM TEXT DM5.TEX2BFTBSH9999SBRT2LRATRACE201TEX3GWS0P2-AA//D-14839048-99-3THERE WAS 200 COALS IN HIS STOCKING.预期匹配:字符串 1:编号:TEX1参考 1:CNS0P5-AA参考 2:CAT-523-VID-00EOS-0额外:XUX PETER LAB 随机文本 DM5。字符串 2:编号:TEX2参考 1:BFTBSH9999SBRT2Lref2:(不匹配,因为“//”没有出现在这个文本中)附加:RA TRACE201字符串 3:编号:TEX3参考 1:GWS0P2-AA参考 2:D-14839048-99-3额外:他的袜子里有 200 块煤。
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

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

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

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

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


查看完整回答
反对 回复 2023-02-07
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

怎么样

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

?

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



查看完整回答
反对 回复 2023-02-07
?
Helenr

TA贡献1780条经验 获得超4个赞

我最终发现了一个更理想的答案,因为当 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

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


查看完整回答
反对 回复 2023-02-07
  • 3 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号