Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Парсинг url с помощью регулярных выражений


(Виталий Коряков) #1

Добрый день.
Вопрос, конечно избит, но пока не могу найти ответ по моей проблеме.
Необходимо найти url в тексте и записать в список.

Стринга пусть будет такой:
“df dz zfgh dfohg @dflhg (sdfgfg) zdjkfhg@dflhgdfg(dfgdfg) https://twitter.com/430511497475670016 dafg sd g https://twitter.com/us/430511497475d f gd g https://twitter.com/tus/4305

import re
def get_links(chat_string):
    pattern = '(https?:\/\/)?([\w\.]+)\.([a-z]{2,6}\.?)(\/[\w\.]*)*\/?$'
    return re.findall(pattern, chat_string)

input_raw = raw_input("Input chat string: ")
links = get_links(input_raw)
print links

Получаю вот такой результат:

[('https://', 'twitter', 'com', '/4305')]

В чем проблема?
http://www.regexr.com/ с упомянутой регуляркой парсинга линки дает нормальную линку, почему у меня кусками находится?

Спасибо.


(Andrey Kurilov) #2

Я юзаю такую

\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]

(Mykhailo Poliarush) #3

Потому что надо убрать символ конца строки в регулярке. А также я убрал группы, чтобы сразу линки получались а не список

import re

def get_links(chat_string):
    pattern = '(?:https?:\/\/)?(?:[\w\.]+)\.(?:[a-z]{2,6}\.?)(?:\/[\w\.]*)*\/?'
    return re.findall(pattern, chat_string)

input_raw = "df dz zfgh dfohg @dflhg (sdfgfg) zdjkfhg@dflhgdfg(dfgdfg) https://twitter.com/430511497475670016 dafg sd g https://twitter.com/us/430511497475d f gd g https://twitter.com/tus/4305"
links = get_links(input_raw)
print links

и получаю

['https://twitter.com/430511497475670016', 'https://twitter.com/us/430511497475d', 'https://twitter.com/tus/4305']

(Виталий Коряков) #4

Значит проблема все таки была в регулярке, вот и верь после этого Хабру. )))
Спаисбо за ответы.


(Сергей Блохин) #5

Зачем мучиться с регулярками, если можно взять готовую библиотеку.

На Ruby

URI.extract 'foo http://example.com/ bar http://example.org/ 42'
=> ["http://example.com/", "http://example.org/"]

Уверен, что и на Python есть подобные библиотеки (иначе переходите на Ruby).