Python URL 匹配(正则表达式)

标签 python regex

我已经尝试匹配以下网址几个小时,但似乎无法弄清楚,我很确定它并不那么困难:

URL 可以是这样的:

/course/lesson-one/

或者也可以是:

/course/lesson-one/chapter-one/

我所拥有的是与第二个 URL 匹配的以下内容:

/course/([a-zA-Z]+[-a-zA-Z]*)/([a-zA-Z]+[-a-zA-Z]*)/

我想要的是第二部分是可选的,但我无法弄清楚我得到的最接近的是:

/course/([a-zA-Z]+[-a-zA-Z]*)/*([a-zA-Z]+[-a-zA-Z]*)/

但是由于某种原因,上面省略了单词的最后一个字母,例如,如果 URL 是

/course/computers/

我最终得到字符串“computer”

最佳答案

如果您需要可选部分,请使用?

/course/([a-zA-Z][-a-zA-Z]*)/([a-zA-Z][-a-zA-Z]*/)?
#                                                 ^

(请注意,[a-zA-Z]+[-a-zA-Z]* 相当于[a-zA-Z][-a-zA-Z ]*。)

使用附加分组 (?:...) 从匹配中排除 /,同时允许多个元素同时可选:

/course/([a-zA-Z][-a-zA-Z]*)/(?:([a-zA-Z][-a-zA-Z]*)/)?
#                            ~~~                     ~^
<小时/>

你的第二个正则表达式吞掉了最后一个字符,因为:

  /course/([a-zA-Z]+[-a-zA-Z]*)/*([a-zA-Z]+[-a-zA-Z]*)/
          ^^^^^^^^^^^^^^^^^^^^^  ~~~~~~~~~~~~~~~~~~~~~
        this matches 'computer'  and this matches the 's'.

由于 +,此正则表达式中的第二组需要匹配一些长度为 1 或更大的字母,因此 's' 必须属于那里。

关于Python URL 匹配(正则表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16449551/

相关文章:

python - 属性错误: module 'secrets' has no attribute 'token_bytes'

regex - 与 shell-globbing 通配符和 Regex 的混淆

java - 字符串的正则表达式模式至少 4 个字符,在字符串末尾包含特定字符

javascript - 如何解决 JS 正则表达式在按键期间不起作用的问题

java - 使用正则表达式删除标签之间的文本

Python - 数据框中每个字符串的 str.match

python - numpy.polyfit 没有关键字 'cov'

regex - 正则表达式 : Replacing Portions of a Regex Match

python - 使用 BeautifulSoup 获取元素内的实际内容

python - pip install 暴力破解(无提示)