首页 > 解决方案 > Python Regex 不会在匹配中包含所有组

问题描述

我在 python 中有一个正则表达式,它在链接之前返回所有带有取消订阅或选择退出的 http[s] 链接。

(unsubscribe|opt out).*(https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*))

我的问题:如果在匹配中有 2 个链接,正则表达式将返回最后一个而不是第一个。例如

blablablablabla unsubscribe blablabla http://link1.com blablabla http://link2.com

链接 2 将是一个组,而不是链接 1

有谁知道如何将链接 1 作为一个组获取?

标签: pythonregex

解决方案


我不确定您是否会找到一个 RE 来执行此操作,但您可以尝试两个。首先,您将字符串与:

(unsubscribe|opt out)(.*)

然后从该匹配中提取第 2 组。并通过第二个 RE 泵组 2:

(https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*))

这将为每个链接返回一个匹配项。如果我用你的例子做这个,我会得到:

Group 2 = blablablablabla unsubscribe blablabla http://link1.com blablabla http://link2.com

然后在第二次测试中:

Match 1, Group 1 = http://link1.com
Match 2, Group 1 = http://link2.com

这里有一个很棒的正则表达式测试器:

https://regex101.com/

我已经为快速测试此类场景添加了书签。


推荐阅读