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

4 投票
3 回答
3363 浏览
提问于 2025-04-18 08:25

我在使用Python的re模块时遇到了一些困难。我不知道怎么用简单的方法解决下面这个问题。

我想从一个网址中提取一部分内容,

我到目前为止尝试过的方式是:

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,但我觉得这不是提取这个部分的正确方法。

我该怎么做才能更快更简洁地解决这个问题呢?

3 个回答

0

如果你想在一个网址中找到所有的“slug”(通常是指网址中用来标识某个页面的简短文本),你可以使用这段代码。

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
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

4

要使用捕获组,你可以在想要捕获的正则表达式部分加上括号 (...)。你可以通过把组的编号作为参数传给 m.group() 来获取捕获组的内容:

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

来自 文档

(...)
这个表达式会匹配括号内的任何正则表达式,并标记出一个组的开始和结束;在匹配完成后,你可以获取这个组的内容,并且可以在字符串中用 \number 这个特殊序列来再次匹配。要匹配字符 '('')',可以使用 \(\),或者把它们放在字符类中: [(] [)]

撰写回答