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

#regex #python-3.x

#регулярное выражение #python-3.x

Вопрос:

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

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

[РЕДАКТИРОВАТЬ] Хорошо, я не совсем решил проблему таким образом, но нашел обходной путь, который может быть не очень элегантным, но, по крайней мере, кажется, выполняет свою работу :

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

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

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

Комментарии:

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

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

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

Ответ №1:

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

Комментарии:

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