Попробуйте этот шаблон:
pattern = re.compile(r"(?P<day>\d{1,2}) (?P<month>[A-Z][a-z]{2,}) (?P<year>\d{2,4})")
Именованные группы захвата, например (?P<day> \d{0,2}
, означают, что вы можете получить доступ к 3-кортежу, который возвращается, и извлечь только это поле.
Затем вы может сделать что-то вроде этого:
>>> for match in re.finditer(pattern, str):
>>> .... print(match.group("day"))
Я бы также использовал apply
вместо l oop для доступа к вашему DataFrame:
>>> data = {"string": ["14 Feb 1995 Primary Care Doctor:",
"30 May 2016 SOS-10 Total Score:",
"22 January 1996 @ 11 AMCommunication with referring physician?: Done"] }
>>> df = pd.DataFrame.from_dict(data)
>>> df.string.apply(lambda x: re.search(pattern, x).group("day"))
0 14
1 30
2 22
Name: string, dtype: object
Тогда вы можете удобно сохранить эти значения отдельно, если вы хотите:
>>> df["day"] = df.string.apply(lambda x: re.search(pattern, x).group("day"))
>>> df["month"] = df.string.apply(lambda x: re.search(pattern, x).group("month"))
>>> df
string day month
0 14 Feb 1995 Primary Care Doctor: 14 Feb
1 30 May 2016 SOS-10 Total Score: 30 May
2 22 January 1996 @ 11 AMCommunication with refe... 22 January
ETA: Если вы хотите настроить его, чтобы извлекать только сокращенный месяц, независимо от того, полностью ли он прописан, попробуйте заменить шаблон регулярного выражения выше со следующим текстом:
pattern = re.compile(r"(?P<day>\d{1,2}) (?P<month>[A-Z][a-z]{2})[a-z]*? (?P<year>\d{2,4})")
Это захватит только первые 3 символа названия месяца, но найдет даты, даже если они имеют более длинную версию.