Как использовать RE ИЛИ Операнд для Панд RE .str.extract()

Я новичок и уверен, что это что-то глупое в моем коде. В свою защиту я попытался перечитать здесь документацию по Python RE, прежде чем задавать вопросы и искать, но пока не вижу дублирующего вопроса (что меня удивило).

Вне DataFrame у меня есть мой рабочий пример здесь:

x = 'my best friend's birthday is 24 Jan 2001.'
print(re.findall('\d{1,2}\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\s\d{2,4}', x))
<Anaconda console returns:> 24 Jan 2001

Но в моем Dataframe (df1) У меня есть следующее:

index     text
0         My birthday is 2/21/19
1         Your birthday is 4/1/20
2         my best friend's birthday is 24 Jan 2001.   

Когда я запускаю следующий код:

df1['dates'] = df1['text'].str.extract('.*?(\d+[/-]\d+[/-]?\d*).*?|\d{1,2}\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\s\d+')
print('df1['dates'])

Я получаю следующие результаты:

     dates
0    2/21/19
1    4/1/20
2    NaN

Я попытался поиграть с круглыми скобками, перечитать документацию и некоторые другие изменения, которые привели к бесконечным ошибкам. Я уверен, что это очевидная ошибка, но я ее не вижу. Может кто-нибудь помочь? Спасибо.

1 ответ

Решение

Вы должны иметь группу захвата при использовании .extract() в пандах. Ваша группа захвата до операции, |Находит даты с косой чертой. Но после операции у вас есть только группа без захвата.

Здесь я поместил захват вокруг всего шаблона поиска, и у каждой стороны ИЛИ также есть группа без захвата.

import pandas as pd

df = pd.DataFrame({'text': ['My birthday is 2/21/19', 
    'Your birthday is 4/1/20', 
    'my best friend\'s birthday is 24 Jan 2001.']})

df.text.str.extract(
    r'((:?\d+[/-]\d+[/-]?\d*)|' + 
    r'(:?\d{1,2}\s(:?Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\s\d+))', 
    expand=False)[0]

# returns:
0        2/21/19
1         4/1/20
2    24 Jan 2001
Другие вопросы по тегам