Regex, чтобы пропустить один Di git и извлечь все - PullRequest
0 голосов
/ 18 марта 2020

Данные

  t=  pd.DataFrame({'A': ['3.1 Food', '3.1.1 Bread', '3.1.1.1 Chicken'], 'Val1': [10, 14, 94], 'Val2': [1,2,3], 'Val3' : [100, 120, 130]}, 
                      columns=['A', 'Val1'])

                 A  Val1
0         3.1 Food    10
1      3.1.1 Bread    14
2  3.1.1.1 Chicken    94

Ожидаемый вывод

Я пытаюсь использовать условные регулярные выражения для извлечения значений и формирования нового столбца , с выводом ниже. Меня интересуют только значения с шаблоном \ d {1}. \ D {1}. \ D {1}

A              Val1   SubCategory
3.1 Food        10        nan
3.1.1 Bread     14    3.1.1 Bread
3.1.1.1 Chicken 94        nan

Что я пробовал

t['SubCategory'] = t['A'].str.extract(r'^(\d{1}.\d{1}.\d{1}.*)')

       A        Val1          SubCategory
3.1   Food       10           nan
3.1.1 Bread     14        3.1.1 Bread
3.1.1.1 Chicken 94      3.1.1.1 Chicken

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

Ответы [ 3 ]

2 голосов
/ 18 марта 2020

Просто добавьте пробел в конце:

import pandas as pd


t=  pd.DataFrame({'A': ['3.1 Food', '3.1.1 Bread', '3.1.1.1 Chicken'], 'Val1': [10, 14, 94], 'Val2': [1,2,3], 'Val3' : [100, 120, 130]},
                      columns=['A', 'Val1'])
t['SubCategory'] = t['A'].str.extract(r'^(\d{1}\.\d{1}\.\d{1})\s')

print(t)

                 A  Val1 SubCategory
0         3.1 Food    10         NaN
1      3.1.1 Bread    14       3.1.1
2  3.1.1.1 Chicken    94         NaN
2 голосов
/ 18 марта 2020

Использование утверждения ^ в начале шаблона должно работать:

^((?:\d\.){2}\d)[^.]

Пример:

https://regex101.com/r/KucJkp/2

1 голос
/ 18 марта 2020

За мой комментарий: обратите внимание на обстоятельства желаемой строки: есть три числа, разделенные точками, и начало строки перед, и пробел после. Вы получили начальную привязку в строке кода, но не конечную.

t['SubCategory'] = t['A'].str.extract(r'^(\d{1}.\d{1}.\d{1} .*)')

(Если вы просто хотите захватить цифры в совпадении, без пробела, вы бы хотели использовать положительный прогноз вместо: r'^(\d{1}.\d{1}.\d{1})(?= )')

...