2016-12-13 2 views
0

У меня есть список URL-адресов, из которых я пытаюсь получить только номера идентификаторов. Я пытаюсь решить эту проблему, используя комбинацию URLParse и регулярных выражений. Вот как моя функция выглядит следующим образом:Соответствующие регулярные выражения в python, который содержит URL-адреса

def url_cleanup(url): 
    parsed_url = urlparse(url) 
    if parsed_url.query=="fref=ts": 
     return 'https://www.facebook.com/'+re.sub('/', '', parsed_url.path) 
    else: 
     qry = parsed_url.query 
     result = re.search('id=(.*)&fref=ts',qry) 
     return 'https://www.facebook.com/'+result.group(1) 

Однако, я чувствую, что регулярное выражение result = re.search('id=(.*)&fref=ts',qry) не совпадает некоторые из URL-адресов, как описано в примере ниже.

#1 
id=10001332443221607 #No match 

#2 
id=6383662222426&fref=ts #matched 

Я попытался взять предложение в соответствии с предложением, представленным в this ответе, перефразировав мое регулярное выражение id=(.*).+?(?=&fref=ts), которое снова соответствует # 2, но не # 1 в приведенных выше примерах.

Я не уверен, что здесь отсутствует. Любое предложение/подсказка будет высоко оценена.

+0

Есть несколько интернет-тестеров регулярных выражений, которые используют аромат Python, они очень удобны для крафта моделей. https://regex101.com/ - один. Вы пробовали '' id = (\ d *) ''для шаблона? – wwii

ответ

2

Ваши регулярные выражения являются неправильно, на самом деле.

, используя выражение id=(.*)&fref=ts, вы будете соответствовать только идентификаторам, которые соответствуют &fref=ts буквально.

используя id=(.*).+?(?=&fref=ts), вы будете делать то же самое, но используя lookahead, который является не захватывающим групповым выражением. Это означает, что ваш матч будет только частью id=blablabla, но только в том случае, если он достигнут &fref=ts.

Кроме того, id=(.*) будет соответствовать идентификаторам, состоящим из цифр, букв, символов ... буквально ничего. Использование id=\d+ будет соответствовать идентификационным номерам.

Итак, попробуйте использовать

result = re.search('id=(\d+)', qry) 

это позволит вам поймать только цифры, предположит, ваши идентификаторы всегда цифры, и захват (с использованием скобки) только эти цифры для последующего использования.

Для дальнейшей ссылки см http://www.regular-expressions.info/python.html

1

Вашему регулярному выражению нужно немного подстроить. Попробуйте:

result = re.search('id=(\d+)(&fref=ts)?', qry) 

id=(\d+) совпадает с любым количеством цифр после id= и (&fref=ts)? позволяет следующей группе букв, чтобы быть необязательной. Это позволит вам добавить их в случае необходимости.

Следует также отметить, что это вызовет ошибку, если совпадение не найдено - так что вы можете немного изменить, чтобы:

result = re.search('id=(\d+)(&fref=ts)?', qry) 
if result: 
    return 'https://www.facebook.com/'+result.group(1) 
else: 
    # some error catch 
Смежные вопросы