#regex #python-3.x
#регулярное выражение #python-3.x
Вопрос:
Я очищаю цитаты из Twitter, и из этих цитат я хочу отделить фактическую цитату от ее автора.
Как я могу это сделать, если твиты отформатированы неравномерно?
Я новичок в регулярных выражениях, но вот моя лучшая попытка в regex101 https://regex101.com/r/m3WtmX/5.
И ниже приведен код, который у меня есть, я хочу, чтобы каждый цикл печатался sre.SRE_Match object
, но печатался последний None
.
import re
QUOTE_PATTERN = re.compile(r'^(?P<actual_quote>.*)s ?-s*(?P<author>.*)$')
# actual_quote is separated from author by space and dash
format_1 = "Any form of exercise, if pursued continuously, will help train us in perseverance -Mao Tse-Tung"
# separated by one space, dash and another space
format_2 = "Any form of exercise, if pursued continuously, will help train us in perseverance - Mao Tse-Tung"
# actual_quote is surrounded with double quotes character and
# is separated from author by space, dash and another space
format_3 = '"Any form of exercise, if pursued continuously, will help train us in perseverance" - Mao Tse-Tung'
# separated only with dash (no space)
format_4 = "Any form of exercise, if pursued continuously, will help train us in perseverance-Mao Tse-Tung"
for format in [format_1, format_2, format_3, format_4]:
print(QUOTE_PATTERN.match(format))
Комментарии:
1. Может быть сложно написать единый шаблон, который может охватывать все ваши крайние случаи.
2. @TimBiegeleisen Я ожидаю этого ответа :/. Это из-за того, что у автора есть тире, верно?
3. Да, и я не вижу никакого очевидного надежного способа отличить тире как разделитель от тире как части чьей-либо фамилии.
4. УЧин-Нин Чу и Мао Цзэдуна есть. Кстати, спасибо.
5. Вы хотите сохранить » в группе actual_quote?
Ответ №1:
Это действительно сложно, поскольку структура этих данных не регулярна.
Получение всех символов первой группы перед тире нежадным способом работает с предоставленными вами кавычками.
^(?P<actual_quote>.*?)-(?P<author>.*)$
https://regex101.com/r/rcGzzK/2
Если вы не хотите включать дополнительные пробелы:
^(?P<actual_quote>.*?)s*-s*(?P<author>.*)$
https://regex101.com/r/rcGzzK/3
К сожалению, если в самой цитате есть какие-либо тире, то приведенные выше регулярные выражения работать не будут.
Комментарии:
1. 1 за отзыв, хотя это не решает мою проблему. Я остановился на более конкретном и более строгом шаблоне, теперь я доволен
["']{0,1}([A-Z].*[.!?])["']{0,1}s*?[-~]s*(.*)$
. В любом случае спасибо 🙂