有一个清单
urls = ['abc.ru/v2', 'abc.com/er.tyre.6/title/86348', 'ab.com/test/ertg.yeg/title/86348', 'abc.com/feed?app_id=57655', 'bcd.ru/467', 'abc.com/shth/5583628', 'abc.com/jhydhf']
有代码
urls = [url for url in urls if re.search(r'((abc\.com/|ab\.com/)+[\.a-zA-Z\d]+(/title/\d{5})+)', url) and not re.search(r'[?=%-]', url)]
我得到以下结果
['abc.com/er.tyre.6/title/86348']
常规赛缺少什么让“ab.com/test/ertg.yeg/title/86348”也包含在最终名单中?
test 是一个可以在链接中出现 0 或 1 次的词
PS昨天我问了一个类似的问题,但我没有完全理解
让我们尝试找出表达式有什么问题:
该组本身
(abc\.com/|ab\.com/)
仅在地址中的一个字符不同c
,它可以替换为abc?\.com/
- 在这种情况下,问号是前一个字符出现 0 或 1 次的量词。此外,如果 test 是 url 的静态部分并且应该始终位于地址由四个嵌套组成的位置,那么应该添加一个新组,
(test/)?
其中包含类似于 0 或 1 次出现的量词。通过添加 可以使组不可捕获?:
。然后表达式将如下所示:示例:regex101.com/v2
如果地址的嵌套
test
不是静态的并且名称未知,那么您应该(?:/[\.a-zA-Z\d]+){1,2}
通过为 1 或 2 个匹配项设置一个量词来创建一个新组。然后表达式将如下所示:示例:regex101.com/v1
评论后更新:如果地址是不同的,例如 domain.com/ 或 niamod.ru,那么组当然必须离开: