#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-адрес вставлялся сразу после цитаты, так что в любом случае это не должно быть проблемой.