регулярное выражение даты в некотором тексте, заключенное в два ключевых слова

1

Это часть 2 этого question и очень спасибо за ответ David . Что делать, если мне нужно извлечь даты, которые ограничены двумя ключевыми словами?

Пример:

text = "One 09 Jun 2011 Two 10 Dec 2012 Three 15 Jan 2015 End"

Case 1 bounding keyboards: "One" and "Three"
Result expected: ['09 Jun 2011', '10 Dec 2012']

Case 2 bounding keyboards: "Two" and "End"
Result expected: ['10 Dec 2012', '15 Jan 2015']

Спасибо!

  • 0
    @ Гораций, ты задавал свой вопрос дважды? stackoverflow.com/questions/2770040/...
  • 0
    @Lirik, второй вопрос добавляет еще одно условие, поэтому я лучше разделить их.
Теги:

2 ответа

2
Лучший ответ

Вы можете сделать это с помощью двух регулярных выражений. Одно регулярное выражение получает текст между двумя ключевыми словами. Другое регулярное выражение извлекает даты.

match = re.search(r"\bOne\b(.*?)\bThree\b", text, re.DOTALL)
if match:
    betweenwords = match.group(1)
    dates = re.findall(r'\d\d (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4}', betweenwords) 
  • 0
    это работает, спасибо! кроме того, что re.findal (..., text) должен быть re.findall (..., Между словами) Кстати, первый и последний "\ b" требуется в первом регулярном выражении?
  • 0
    Я исправил параметр findall . Все 4 \b обязательны, если вы хотите, чтобы ваши слова соответствовали целым словам. Например, \bEnd\b не может соответствовать Ending . Если вам все равно, являются ли ваши два ключевых слова целыми или частичными, вы можете опустить все 4 \b .
0

Вам действительно нужно беспокоиться о ключевых словах? Можете ли вы гарантировать, что ключевые слова не изменятся?

Если нет, то то же самое решение из предыдущего вопроса может решить следующее:

>>> import re
>>> text = "One 09 Jun 2011 Two 10 Dec 2012 Three 15 Jan 2015 End"
>>> match = re.findall(r'\d\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}', text)
>>> match
['09 Jun 2011', '10 Dec 2012', '15 Jan 2015']

Если вам действительно нужны только две даты, вы можете просто использовать нарезку списка:

>>> match[:2]
['09 Jun 2011', '10 Dec 2012']
>>> match[1:]
['10 Dec 2012', '15 Jan 2015']
  • 0
    Ключевые слова (определяемые пользователем) важны для исключения некоторых дат, которые не находятся внутри соответствующей части документа.
  • 0
    Значит, ключевые слова будут разными и будут иметь переменную длину? Вам придется использовать жадное сопоставление. Только альфа или буквенно-цифровой? Все это важные соображения при построении ваших шаблонов.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню