регулярное выражение для получения URL не удается

0

Я нашел регулярное выражение для получения URL-адресов со страниц:

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s'!()\[\]{};:'".,<>?«»""‘]))

Но я не могу применить это в python. Даже объявление переменной, содержащей это выражение, не выполняется с сообщением "недействительный синтаксис":

Python 2.7.5 (default, Sep  6 2013, 09:55:21) 
[GCC 4.8.1 20130725 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s'!()\[\]{};:'".,<>?«»""'']))"
  File "<stdin>", line 1
    a = "(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s'!()\[\]{};:'".,<>?«»""'']))"
                                                                                                                                                                                                        ^
SyntaxError: invalid syntax

Я попробовал здесь, и это сработало хорошо. Кто-нибудь знает, как заставить это работать?

Теги:
url

1 ответ

2
Лучший ответ

Ваша строка регулярного выражения заканчивается в двойных кавычках в конце ;:'", поэтому почему это синтаксическая ошибка.

pythonregex.com автоматически добавляет \, чтобы избежать ", производя:

regex = re.compile("(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s'!()\[\]{};:'\".,<>?«»""‘]))")

Обратите внимание, что это имеет ;:'\" вместо ;:'". Я удивлен, что тот, кто написал pythonregex.com, решил добавить это для вас, а не позволить ему дать синтаксическую ошибку.

Я обнаружил, что на моем интерпретаторе мне нужно было использовать r"raw string syntax" python r"raw string syntax" чтобы он работал:

In [31]: string="foo.com/blah_blah kuhiuh www.example.com"

In [32]: In [29]: regex = re.compile(r"(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s'!()\[\]{};:'\".,<>?«»""‘]))")

In [33]: regex.findall(string)
Out[33]: [('foo.com/blah_blah', '', '', '', ''), ('www.example.com', '', '', '', '')]

Не уверен, какой из символов делает необходимым, но там уверены какие-то странные.

  • 0
    звучит разумно, хотя. Но использование экранированной версии приводит к пустому списку результатов regex.findall (" foo.com/blah_blah" )
  • 0
    Любопытно. Глядя на это сейчас.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню