【发布时间】:2019-01-22 09:17:35
【问题描述】:
我的 URL 模式总是以顶级 url 后面的 3 个单词之一开头:
word1
word2
word3
然后在几个子目录(最多 4 级)中可能有任何内容,但总是:
lowercaseword 或 lowercaseword-lowercaseword
现在我正在搜索一个 reg ex,它会完全匹配这个但不是一个以下划线开头的子目录:
_lowercaseword
所以我的网址是:
example.com/word1/lowercaseword/lowercaseword/?parameters
example.com/word2/lowercaseword/
example.com/word3/lowercaseword/lowercaseword/lowercaseword/
example.com/word2/lowercaseword/lowercaseword/_lowercaseword/
我正在寻找一个匹配前三个的正则表达式。
我无法弄清楚消极的环顾四周(如果需要的话)。 有什么想法吗?
这些是我的表达方式,但它们不起作用:
\/(word1|word2|word3)\/((?!\_)[a-z]+(\-[a-z]+)?\/){0,4}
\/(word1|word2|word3)\/([!\_a-z]+(\-[a-z]+)?\/){0,4}
【问题讨论】:
-
试试
^[^/]+/(word1|word2|word3)(?:/[a-z]+(?:-[a-z]+)?){0,4}/?(?:\?.*)?$,见this regex demo -
我知道正则表达式是第一个想法,但考虑到代码的复杂性、可读性和可维护性,我认为在这种特定情况下,您最好采用不同的方法。具体来说,您可以使用
urllib.parse来获取URL 参数,并在需要时查看它们是否以_开头。这也将允许更轻松地保留要匹配的words 列表。 -
@ChatterOne 也是我最喜欢的解决方案,但正则表达式是我的代码结构中的一个必要条件,用于抓取爬虫。我只是没有提到scrapy,因为我认为这个问题无关紧要。
-
@WiktorStribiżew 谢谢,这似乎确实有效。如果您将此添加到答案中,我会接受它作为答案。 :)
-
@Chris 发布了解释。
标签: python regex python-3.x scrapy