【问题标题】:Reg Ex for a negative lookaround or negative assertion for an underscore neededReg Ex 用于否定环视或否定断言需要下划线
【发布时间】:2019-01-22 09:17:35
【问题描述】:

我的 URL 模式总是以顶级 url 后面的 3 个单词之一开头:

word1
word2
word3

然后在几个子目录(最多 4 级)中可能有任何内容,但总是: lowercasewordlowercaseword-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


【解决方案1】:

你可以使用

^[^/]+/(word1|word2|word3)(?:/[a-z]+(?:-[a-z]+)?){0,4}/?(?:\?.*)?$

请参阅regex demo

详情

  • ^ - 字符串开头
  • [^/]+ - 除了/ 之外的 1+ 个字符
  • / - 斜线
  • (word1|word2|word3) - 任意字词
  • (?:/[a-z]+(?:-[a-z]+)?){0,4} - / 的零到四次重复,1+ 小写 ASCII 字母,然后是 - 和 1+ 个小写 ASCII 字母的可选序列
  • /? - 一个可选的/
  • (?:\?.*)? - ? 的可选序列,然后是任何 0+ 字符直到...
  • $ - 字符串结束。

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 2016-08-14
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2015-08-03
    相关资源
    最近更新 更多