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

#python #python-3.x #regex #regex-group

#python #python-3.x #регулярное выражение #регулярное выражение-группа

Вопрос:

Мое выражение регулярного выражения соответствует другим неожиданным группам. Моя цель — извлечь дату указанного формата (месяц в буквах, за которым следуют годы, например, март 2009 года), но выражение соответствует и фиксирует другие форматы, такие как 20 марта 2009 года. Ввод выглядит следующим образом.

df5 = pd.Series(["04/20/2009", "04/20/09", "4/20/09", "4/3/09", "Mar-20-2009", "Mar 20, 2009", "March 20, 2009", "Mar. 20, 2009", "Mar 20 2009", "20 Mar 2009","20 March 2009", "20 Mar. 2009", "20 March, 2009", "Mar 20th, 2009", "Mar 21st, 2009", "Mar 22nd, 2009", "Feb 2009", "Sep 2009", "Oct 2010", "6/2008","12/2009", "2009", "2010"])

df5.str.extractall(r'(?P<date>(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z., -]*d{4})') Затем я перепроверил свое выражение на веб-сайте regex101 и внес в него изменения. Измененное выражение выглядит следующим образом

[^ ](?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z., -]*d{4}

Но измененное выражение не соответствует никаким значениям в dataframe, тогда как с измененным выражением я могу получить необходимый [вывод] на веб-сайте regex101. Где я ошибаюсь?

Ответ №1:

Первый выглядел нормально, вам просто нужно начать с символа начала строки ^ :

 df5.str.extractall(r'^(?P<date>(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z., -]*d{4})')

16 0      Feb 2009
17 0      Sep 2009
18 0      Oct 2010
  

Редактировать:

Возможно, вы захотите добавить это пространство как обязательное, поэтому выньте его из квадратных скобок:

 df5.str.extractall(r'^(?P<date>(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z.,-]* d{4})')