我已经尝试匹配以下网址几个小时,但似乎无法弄清楚,我很确定它并不那么困难:
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/