Python 从 URL 中提取用户名

Python extract username from URL

我正在使用 Python scraping reddit 用户名,我正在尝试从 URL 中提取用户名。 URL 看起来像这样:

https://www.reddit.com/user/ExampleUser

这是我的代码:

def extract_username(url):
    start = url.find('https://www.reddit.com/user/') + 28
    end = url.find('?', start)
    end2 = url.find("/", start)
    return url[start:end] and url[start:end2] and url[start:]

第一部分有效,但删除问号和正斜杠无效。也许我用错了 "and" 关键字?这意味着我有时会得到这样的东西:

ExampleUser/
ExampleUser/comments/
ExampleUser/submitted/
ExampleUser/gilded/
ExampleUser?sort=hot
ExampleUser?sort=new
ExampleUser?sort=top
ExampleUser?sort=controversial

我知道我可以使用 api,但我想了解如何不用它。我也听说过正则表达式,但它们不是很慢吗?

您可以使用 re 模块。

>>> s = "https://www.reddit.com/user/ExampleUser/comments/"
>>> import re
>>> re.search(r'https://www.reddit.com/user/([^/?]+)', s).group(1)
'ExampleUser'

[^/?]+ 否定字符 class 匹配任何字符但不匹配 /? 一次或多次。 () 捕获否定字符周围的组 class 捕获那些匹配的字符。稍后我们可以通过反向引用来引用捕获的字符(比如 </code> 引用组索引 1)。 </p> <p>通过定义一个单独的函数。</p> <pre><code>>>> def extract_username(url): ... return re.search(r'https://www.reddit.com/user/([^/?]+)', url).group(1) ... >>> extract_username('https://www.reddit.com/user/ExampleUser') 'ExampleUser' >>> extract_username('https://www.reddit.com/user/ExampleUser/submitted/') 'ExampleUser' >>> extract_username('https://www.reddit.com/user/ExampleUser?sort=controversial') 'ExampleUser'

这会删除 '?' 后面的所有内容然后在 '/' 上拆分,检索第五个元素,即用户名:

>>> s = 'https://www.reddit.com/user/ExampleUser?sort=new'
>>> s.split('?')[0].split('/')[4]
'ExampleUser'

这也适用于您展示的其他案例。例如:

>>> s = 'https://www.reddit.com/user/ExampleUser/comments/'
>>> s.split('?')[0].split('/')[4]
'ExampleUser'
>>> s = 'https://www.reddit.com/user/ExampleUser'
>>> s.split('?')[0].split('/')[4]
'ExampleUser'

只是为了好玩,这里有一个使用 find 的例子。基本上,您只想在找到定界符的地方取最小值,如果根本找不到则取末尾:

def extract_username(url):
    username = url[len('https://www.reddit.com/user/'):]
    end = min([i for i in (len(username), 
                           username.find('/'), 
                           username.find('?') ) if i >=0])
    return username[:end]

for url in ('https://www.reddit.com/user/ExampleUser', 
          'https://www.reddit.com/user/ExampleUser/submitted/',
          'https://www.reddit.com/user/ExampleUser?sort=controversial'):
    print extract_username(url)