Извлечение дат с использованием Regex в python

Я хочу извлечь год из столбца фрейма данных 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()

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

CopyRight_year
2015
2015
2014
2014
2014
2014

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

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

CopyRight_year
    2015
    2015
    2014,2015
    2014
    2014,2015
    2014,2015
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
144
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

[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, что дает вам большую гибкость и более чистый подход.

Ответ принят как подходящий

Используйте 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

Я бы использовал r'\b\d{4}\b', так как '(\d{4})' будет соответствовать фрагментам из 4 цифр даже внутри фрагментов с более длинными цифрами (например, 0067 в 006789).

Wiktor Stribiżew 24.02.2019 10:28

@jezrael - Большое спасибо, я получаю ожидаемый результат.

Aditya Sharma 24.02.2019 10:56

Другие вопросы по теме