Вы можете использовать .str.extract()
, использовать \d{1,2}
для сопоставления однозначных дней и месяцев и добавить .
к шаблону разделителей:
df['date'] = df['text'].str.extract(r"(\d{1,2}[/. ](?:\d{1,2}|January|Jan)[/. ]\d{2}(?:\d{2})?)")
См. regex demo .
Также обратите внимание, что \d{2}(?:\d{2})?
соответствует 2 или 4 цифрам, а \d{2,4}
соответствует 2, 3 или 4 цифрам.
Обратите внимание, что в целомШаблон регулярного выражения заключен в группу захвата, это необходимо потому, что для работы .str.extract
требуется хотя бы одна группа захвата, он выдаст только захваченный текст.
Чтобы сопоставить даты, не входящие в другие цифры, вы можетедобавьте (?<!\d)
в начале и (?!\d)
в конце, это может сделать шаблон более безопасным.
Если вы планируете соответствовать любому английскому названию месяца, вам нужно немного расширить шаблон:
r"(?<!\d)(\d{1,2}[/. ](?:\d{1,2}|(?:J(?:an(?:uary)?|u(?:ne?|ly?))|Feb(?:ruary)?|Ma(?:r(?:ch)?|y)|A(?:pr(?:il)?|ug(?:ust)?)|Sep(?:t(?:ember)?)?|(?:Nov|Dec)(?:ember)?|Oct(?:ober)?))[/. ]\d{2}(?:\d{2})?)(?!\d)"
См. еще одну демонстрацию регулярных выражений .
Подробности
(?<!\d)
- цифры слева не допускаются (
- начало группы захвата \d{1,2}
- 1 или 2 цифры [/. ]
- пробел, /
или .
(?:\d{1,2}|(?:J(?:an(?:uary)?|u(?:ne?|ly?))|Feb(?:ruary)?|Ma(?:r(?:ch)?|y)|A(?:pr(?:il)?|ug(?:ust)?)|Sep(?:t(?:ember)?)?|(?:Nov|Dec)(?:ember)?|Oct(?:ober)?))
- название месяца, сокращенное или нет [/. ]
- пробел, /
или .
\d{2}(?:\d{2})?
- 2 цифры с дополнительнымпоследовательность из двух цифр )
- конец группы захвата (?!\d)
- цифра сразу справа не допускается