Я нашел регулярное выражение для получения 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
Я попробовал здесь, и это сработало хорошо. Кто-нибудь знает, как заставить это работать?
Ваша строка регулярного выражения заканчивается в двойных кавычках в конце ;:'"
, поэтому почему это синтаксическая ошибка.
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', '', '', '', '')]
Не уверен, какой из символов делает необходимым, но там уверены какие-то странные.