如何使用Python正则表达式从URL中提取slug?

4
我在使用Python的re时遇到了困难。我不知道如何以简洁的方式解决以下问题。
我想从URL中提取一部分。
迄今为止,我尝试了以下方法:
url = http://www.example.com/this-2-me-4/123456-subj
m = re.search('/[0-9]+-', url)
m = m.group(0).rstrip('-')
m = m.lstrip('/')

这给了我所需的输出123456,但我觉得这不是提取slug的正确方式。
如何更快、更干净地解决这个问题?
3个回答

4

将要捕获的正则表达式部分放在括号内(...)以使用捕获组。通过将其编号作为参数传递给m.group(),您可以获取捕获组的内容:

>>> m = re.search('/([0-9]+)-', url)
>>> m.group(1) 
123456

文档中:
匹配括号内的任何正则表达式,并指示组的开始和结尾;可以在执行匹配后检索组的内容,并且可以在字符串中稍后与\number特殊序列一起匹配。要匹配文字'('')',请使用\(\),或将它们包含在字符类中:[(] [)]

3
您可以使用urllib.parse结合捕获组来编写更简洁的代码。
import urllib.parse, re

url = 'http://www.example.com/this-2-me-4/123456-subj'
parsed = urllib.parse.urlparse(url)
path = parsed.path
slug = re.search(r'/([\d]+)-', path).group(1)
print(slug)

结果:

123456

在Python 2中,使用urlparse代替urllib.parse

你能否解释一下为什么你认为使用urllib.parse更加简洁?因为你的回答其余部分与@Nefta的相同... - mcbetz
1
@MartinBetz 好的,你正在解析一个URL,是吗?我不知道你的代码的其余部分是什么样子的,所以完全有可能这对你来说是过度的,但为了论证起见,如果你有一个像 http://foo.com/bar/123456-subj?arg=/789- 这样的url呢?那不是一个有效的URL,当然(查询应该是%编码),但我可以想象一些情况下需要处理它。 - senshin
谢谢您的解释!答案有点超出了问题的范围,所以我选择了另一个作为最佳答案,但是我从您的回答中学到了额外的知识! - mcbetz
@MartinBetz 没问题! - senshin

0
如果您想查找 URL 中所有可用的短网址,则可以使用以下代码。
from slugify import slugify

url = "https://www.allrecipes.com/recipe/79300/real-poutine?search=random/some-name/".split("/")

for i in url:
    i = i.split("?")[0] if "?" in i else i
    if "-" in i  and slugify(i) == i:
        print(i)

这将提供一个输出

real-poutine
some-name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接