Надежно сопоставить URL внутри строки - PullRequest
0 голосов
/ 09 апреля 2019

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

  • чтение цитаты и URL-адреса из файла
  • разобрать цитату и 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'), чтобы вырезать символ новой строки, он все еще должен быть там, потому что, когда я добавляю кавычки, последний находится на новой строке.

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

1 Ответ

1 голос
/ 09 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...