Надежно сопоставить URL внутри строки

У меня возникли проблемы с выяснением того, что я считал довольно простым регулярным выражением. Я пытаюсь создать бота Twitter на Python, который цитирует цитаты какого-то автора. Мне это нужно, чтобы:

  • прочитать цитату и URL-адрес из файла
  • разобрать цитату и URL-адрес, чтобы он мог добавлять кавычки вокруг части цитаты и используйте часть URL, чтобы определить, какая книга цитата из и добавить соответствующую обложку книги
  • Мне также нужно разделить URL, чтобы рассчитать длину твита после твиттер сократил адрес
  • И последнее: некоторые цитаты могут не иметь URL-адреса, мне это нужно, чтобы определить это и добавить несколько случайных изображений в качестве запасного варианта.

После проб и ошибок я придумал это регулярное выражение, которое, казалось, выполняло свою работу, когда я его тестировал: r'(?P<quote>.*)(?P<link>https.*)?'

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

Но когда я попытался запустить бота, я понял, что он не будет правильно анализировать цитату и вместо этого поймает всю строку как «цитата» (и не сможет определить URL-адрес).

Что меня озадачивает, так это то, что он не дает сбоев постоянно, вместо этого кажется, что иногда он работает, а иногда нет.

Вот пример того, что я пытаюсь сделать, но это ненадежно: https://regex101.com/r/mODPUq/1/

Вот вся функция, которую я написал:

def parseText(text):
    # Separate the quote from the link
    tweet = {}
    regex = r'(?P<quote>.*)?(?P<link>https.*)?'

    m = re.search(regex, text)

    tweet = m.groupdict("")

    return tweet

[EDIT] Хорошо, я не совсем решил проблему таким образом, но нашел обходной путь, который может быть не очень элегантным, но, по крайней мере, кажется, что он выполняет эту работу:

  • У меня есть 2 отдельные функции: одна для получения URL-адреса, другая для разделения URL-адреса из строки и возврата одной цитаты.
  • Сначала я вызываю getUrl(), а потом, только если он возвращает что-то, что не является None, я вызываю getQuote(). Если url == None, я могу напрямую твитнуть всю строку.

Таким образом, часть регулярных выражений стала очень простой, и, похоже, она работает до сих пор с URL-адресом или без него. У меня есть только одна небольшая проблема: когда нет URL-адреса, даже если я использую str.split('/n'), чтобы вырезать символ новой строки, он все равно должен быть там, потому что, когда я добавляю кавычки, последний находится на новой строке.

Я пока оставляю проблему открытой, так как технически она не решена, спасибо тем, кто дал мне ответ, но, похоже, это не работает.

Она соответствует всей строке, потому что первая .* жадная, а вторая группа необязательна, как и следующая .*. Если вы хотите сопоставить часть http, вы можете использовать https?\S+

The fourth bird 09.04.2019 18:15

Да, просто измените жадный квантификатор .* на ленивый .*? в группе <quote>, и это сработает.

Ildar Akhmetov 09.04.2019 18:28

Привет, спасибо за ваши предложения, к сожалению, по крайней мере, в отладчике это не совсем работает. Я вижу, что действительно что-то не так с жадным квантификатором, но просто делая его ленивым, кажется, он ловит каждый символ по одному. Я все равно нашел обходной путь, см. Ниже

Sosthène 10.04.2019 18:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы также можете изменить строку регулярного выражения на r'(?P<quote>.*)?.(?P<link>https.*)', которая также позаботится о любых дополнительных символах между цитатой и ссылкой.

Спасибо, я стараюсь, чтобы URL-адрес вставлялся сразу после цитаты, так что в любом случае это не должно быть проблемой.

Sosthène 10.04.2019 18:17

Другие вопросы по теме