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)
我正在使用 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)