2015-01-19 4 views
0

Я очищаю reddit usernames с помощью Python, и я пытаюсь извлечь имя пользователя из URL. URL выглядит следующим образом:Python извлечения username из 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:] 

Первая часть работы, но удаление знак вопроса и прямой слэш doesen't. Может быть, я использую ключевое слово «и» неправильно? Что означает, что иногда получить что-то вроде этого:

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

Я знаю, что я могу использовать API, но я хотел бы узнать, как это сделать без него. Я также слышал о регулярных выражениях, но не слишком ли они медленны?

ответ

2

Вы можете использовать модуль re.

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

[^/?]+ Инвертированный символьный класс, который соответствует любому символу, но не / или ? один или несколько раз. () группа захвата вокруг класса символов с отрицанием захватывает эти совпадающие символы. Позже мы могли ссылаться на захваченные символы через обратную ссылку (например, \1, которая ссылается на индекс группы 1).

Определяя отдельную функцию.

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

Это удаляет все, что следует за «?» а затем расщепляется на «/», извлекая пятый элемент, который является имя пользователя:

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

Просто для ударов, вот пример использования 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)