Я создаю приложение на Google App Engine. Я невероятно новичок в Python и последние 3 дня бился головой о следующей проблеме.
У меня есть класс для представления RSS-канала, и в этом классе у меня есть метод setUrl. Входом в этот метод является URL.
Я пытаюсь использовать модуль re python для проверки RFC 3986 Reg-ex ( http://www.ietf.org/rfc/rfc3986.txt )
Ниже приведен фрагмент, который должен работать?
p = re.compile('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?')
m = p.match(url)
if m:
self.url = url
return url
python
regex
google-app-engine
Зи Спенсер
источник
источник
urlparse
модуль переименованurllib.parse
в Python 3. Проверьте docs.python.org/3.7/library/…Ответы:
Простой способ проанализировать (и проверить) URL-адрес - это модуль
urlparse
( py2 , py3 ).Регулярное выражение - это слишком много работы.
Не существует метода «проверки», потому что почти все является допустимым URL. Есть некоторые правила пунктуации для его разделения. Без знаков препинания у вас все еще есть действующий URL.
Внимательно проверьте RFC и посмотрите, сможете ли вы создать «недействительный» URL. Правила очень гибкие.
Например,
:::::
действующий URL. Путь есть":::::"
. Довольно глупое имя файла, но допустимое имя файла.Кроме того,
/////
это действующий URL. Netloc ("имя хоста") - это""
. Путь есть"///"
. Опять глупо. Также действительно. Этот URL-адрес нормализуется,"///"
что является эквивалентом.Что-то вроде
"bad://///worse/////"
совершенно верно. Тупой, но действительный.Итог . Разберите его и посмотрите на части, чтобы убедиться, что они чем-то не нравятся.
Вы хотите, чтобы схема всегда была "http"? Вы хотите, чтобы netloc всегда был «www.somename.somedomain»? Вы хотите, чтобы путь выглядел как unix? Или в стиле окна? Вы хотите удалить строку запроса? Или сохранить?
Это не проверки, указанные в RFC. Это проверки, уникальные для вашего приложения.
источник
urlparse
необходимо дополнить использование регулярных выражений для проверки netloc (или другой части) на соответствие определенному стандарту.urlparse({})
там, где ввод не является даже строкой, успешно выполняется без видимой ошибкиВот полное регулярное выражение для синтаксического анализа URL.
Учитывая его сложность, я думаю, вам стоит пойти по пути разбора URL-адресов.
Для полноты, вот псевдо-BNF вышеуказанного регулярного выражения (в качестве документации):
источник
Я использую тот, который используется Django, и, похоже, он работает очень хорошо:
Вы всегда можете проверить последнюю версию здесь: https://github.com/django/django/blob/master/django/core/validators.py#L74
источник
Признаюсь, я нахожу ваше регулярное выражение совершенно непонятным. Интересно, можно ли вместо этого использовать urlparse? Что-то вроде:
Это может быть медленнее, и, возможно, вы пропустите условия, но мне кажется, что его намного легче читать и отлаживать, чем регулярное выражение для URL-адресов .
источник
urlparse
модуль переименованurllib.parse
в Python 3. Проверьте docs.python.org/3.7/library/…В настоящее время в 90% случаев, если вы работаете с URL в Python, вы, вероятно, используете python-запросы. Отсюда возникает вопрос - почему бы не использовать повторно проверку URL из запросов?
Особенности:
источник
urlparse
вполне успешно принимает недопустимые URL-адреса, это больше библиотека для разделения строк, чем какой-либо валидатор. Например:В зависимости от ситуации это может быть нормально ..
Если вы в основном доверяете данным и просто хотите проверить, является ли протокол HTTP, тогда
urlparse
это прекрасно.Если вы хотите, чтобы URL-адрес действительно был законным, используйте нелепое регулярное выражение
Если вы хотите убедиться, что это настоящий веб-адрес,
источник
"http://----"
?? Это совершенно правильный URL! Просто установите имя хоста на «----», и вы уже можете его использовать!http://pypi.python.org/pypi/rfc3987 предоставляет регулярные выражения для согласованности с правилами RFC 3986 и RFC 3987 (то есть не с правилами для конкретной схемы).
Регулярное выражение для IRI_reference:
В одной строке:
источник
нота - Lepl больше не поддерживается и не поддерживается.
RFC 3696 определяет «лучшие практики» для проверки URL - http://www.faqs.org/rfcs/rfc3696.html
Последний выпуск Lepl (библиотека синтаксического анализатора Python) включает реализацию RFC 3696. Вы можете использовать его примерно так:
Хотя валидаторы определены в Lepl, который является рекурсивным синтаксическим анализатором спуска, они в основном компилируются внутри в регулярные выражения. Это объединяет лучшее из обоих миров - (относительно) легкое для чтения определение, которое можно проверить на соответствие RFC 3696, и эффективную реализацию. В моем блоге есть сообщение, показывающее, как это упрощает парсер - http://www.acooke.org/cute/LEPLOptimi0.html
Лепл доступен по адресу http://www.acooke.org/lepl, а модуль RFC 3696 задокументирован по адресу http://www.acooke.org/lepl/rfc3696.html.
Это совершенно новая возможность в этом выпуске, поэтому может содержать ошибки. Пожалуйста, свяжитесь со мной, если у вас возникнут проблемы, и я исправлю их как можно скорее. Спасибо.
источник
Предоставленное регулярное выражение должно соответствовать любому URL- адресу в форме http://www.ietf.org/rfc/rfc3986.txt. ; и работает при тестировании в интерпретаторе Python.
В каком формате были URL-адреса, у которых возникли проблемы с синтаксическим анализом?
источник
Мне приходилось делать это много раз на протяжении многих лет, и я всегда копировал регулярное выражение другого человека, который думал об этом гораздо больше, чем я хотел бы думать об этом.
Сказав это, в коде форм Django есть регулярное выражение, которое должно помочь:
http://code.djangoproject.com/browser/django/trunk/django/forms/fields.py#L534
источник
измененное регулярное выражение проверки URL-адреса django:
источник: https://github.com/django/django/blob/master/django/core/validators.py#L74
источник
ПРИМЕЧАНИЕ: Как бы уродливо это не выглядело в вашем браузере, просто скопируйте и вставьте, и форматирование должно быть хорошим.
Найден в списках рассылки python и используется для gnome-terminal
источник: http://mail.python.org/pipermail/python-list/2007-January/595436.html
источник