Найти регулярное выражение между двумя необязательными шаблонами, вернуть все, если нет - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть ряд новостных статей, в некоторых из которых есть вступительные и конечные заявления.Возможные комбинации: ...

  • Некоторый текст о новостях.
  • BBC сообщает: Небольшой текст о новостях.Подробнее на BBC.com.
  • BBC сообщает: Некоторые тексты о новостях.
  • Некоторые тексты о новостях.Читайте больше на BBC.com.

Что я хотел бы сделать, так это вернуть «Некоторый текст о новостях».в каждом случае.У меня есть следующее регулярное выражение, которое возвращает 1-й и 2-й пример.Я борюсь, когда есть либо вступительные, либо конечные заявления.

re.search(r'(?i)(?<=: ).*(?=Read more|Full story|\. Source)', str(doc)).group()

# "(?i)" to ignore case.
# "(?<=: )" to capture text after and excluding ": "
# ".*" match everything between the two patterns. 
# "(?=Read more|Full story|\. Source)" match everything before these three strings. 

1 Ответ

0 голосов
/ 01 января 2019

Кажется, вы можете использовать

import re
doc = "The BBC reports: Some text about a news story. Read more on BBC.com."
rx = r'(?i)(?:[^:\n]*:\s*|^)(.*?)(?:$|Read more|Full story|\. Source)'
m = re.search(rx, doc)
if m:
    print(m.group(1))

См. Демоверсию regex .

Подробности

  • (?i) - игнорировать регистр флага
  • (?:[^:\n]*:\s*|^) - группа без захвата, соответствующая либо 0+ символам, отличным от :, и новой строке, за которой следует :, а затем 0+ пробелов или начало строки
  • (.*?) - Группа 1: любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • (?:$|Read more|Full story|\. Source) - группа без захвата, соответствующая Read more, Full story или . Source.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...