извлечение даты с помощью Regex в Python - PullRequest
0 голосов
/ 24 февраля 2019

Я хочу извлечь год из столбца моего фрейма данных data3['CopyRight'].

CopyRight
2015 Sony Music Entertainment
2015 Ultra Records , LLC under exclusive license
2014 , 2015 Epic Records , a division of Sony Music Entertainment
Compilation ( P ) 2014 Epic Records , a division of Sony Music Entertainment
2014 , 2015 Epic Records , a division of Sony Music Entertainment
2014 , 2015 Epic Records , a division of Sony Music Entertainment

. Я использую приведенный ниже код для извлечения года:

data3['CopyRight_year'] = data3['CopyRight'].str.extract('([0-9]+)', expand=False).str.strip()

с моим кодом IЯ получаю только первое вхождение года.

CopyRight_year
2015
2015
2014
2014
2014
2014

Я хочу извлечь все годы, указанные в столбце.

Ожидаемый результат

CopyRight_year
    2015
    2015
    2014,2015
    2014
    2014,2015
    2014,2015

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Используйте findall с регулярным выражением для поиска всех целых чисел длиной 4 в списках и в конце join через разделитель:

Спасибо @Wiktor Stribiżew для идеи добавить границу слова r'\b\d{4}\b':

data3['CopyRight_year'] = data3['CopyRight'].str.findall(r'\b\d{4}\b').str.join(',')
print (data3)
                                           CopyRight CopyRight_year
0                      2015 Sony Music Entertainment           2015
1   2015 Ultra Records , LLC under exclusive license           2015
2  2014 , 2015 Epic Records , a division of Sony ...      2014,2015
3  Compilation ( P ) 2014 Epic Records , a divisi...           2014
4  2014 , 2015 Epic Records , a division of Sony ...      2014,2015
5  2014 , 2015 Epic Records , a division of Sony ...      2014,2015
0 голосов
/ 24 февраля 2019

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

[0-9]+(?:\s+,\s+[0-9]+)*

Это регулярное выражение [0-9]+ будет соответствоватьчисла и, кроме того, (?:\s+,\s+[0-9]+)* регулярное выражение будут соответствовать одному или нескольким пробелам, за которыми следует запятая, затем снова следует один или несколько пробелов, а затем, наконец, число и целое из них ноль или более раз, как это доступно в данных.

Демонстрация

Измените свою строку данных panda на эту,

data3['CopyRight_year'] = data3['CopyRight'].str.extract('([0-9]+(?:\s+,\s+[0-9]+)*)', expand=False).str.replace('\s+','')

Отпечатки,

                                           CopyRight CopyRight_year
0                      2015 Sony Music Entertainment           2015
1   2015 Ultra Records , LLC under exclusive license           2015
2  2014 , 2015 Epic Records , a 1999 division of ...      2014,2015
3  Compilation ( P ) 2014 Epic Records , a divisi...           2014
4  2014 , 2015 Epic Records , a division of Sony ...      2014,2015
5  2014 , 2015 Epic Records , a division of Sony ...      2014,2015

Хотя японравился jezrael ответ, который использует findall и join, что дает вам больше гибкости и более чистый подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...