Как извлечь фактическую цитату и автора из цитат, используя регулярное выражение?

#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*(.*)$ . В любом случае спасибо 🙂