У меня возникли проблемы с выяснением того, что я считал довольно простым регулярным выражением. Я пытаюсь создать бота Twitter на Python, который цитирует цитаты какого-то автора. Мне это нужно, чтобы:
После проб и ошибок я придумал это регулярное выражение, которое, казалось, выполняло свою работу, когда я его тестировал: 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] Хорошо, я не совсем решил проблему таким образом, но нашел обходной путь, который может быть не очень элегантным, но, по крайней мере, кажется, что он выполняет эту работу:
getUrl()
, а потом, только если он возвращает что-то, что не является None
, я вызываю getQuote()
. Если url == None
, я могу напрямую твитнуть всю строку.Таким образом, часть регулярных выражений стала очень простой, и, похоже, она работает до сих пор с URL-адресом или без него. У меня есть только одна небольшая проблема: когда нет URL-адреса, даже если я использую str.split('/n')
, чтобы вырезать символ новой строки, он все равно должен быть там, потому что, когда я добавляю кавычки, последний находится на новой строке.
Я пока оставляю проблему открытой, так как технически она не решена, спасибо тем, кто дал мне ответ, но, похоже, это не работает.
Да, просто измените жадный квантификатор .*
на ленивый .*?
в группе <quote>
, и это сработает.
Привет, спасибо за ваши предложения, к сожалению, по крайней мере, в отладчике это не совсем работает. Я вижу, что действительно что-то не так с жадным квантификатором, но просто делая его ленивым, кажется, он ловит каждый символ по одному. Я все равно нашел обходной путь, см. Ниже
Вы также можете изменить строку регулярного выражения на r'(?P<quote>.*)?.(?P<link>https.*)'
, которая также позаботится о любых дополнительных символах между цитатой и ссылкой.
Спасибо, я стараюсь, чтобы URL-адрес вставлялся сразу после цитаты, так что в любом случае это не должно быть проблемой.
Она соответствует всей строке, потому что первая
.*
жадная, а вторая группа необязательна, как и следующая.*
. Если вы хотите сопоставить часть http, вы можете использоватьhttps?\S+