Извлечь часть строки с помощью регулярного выражения перед дефисом, за которым следуют цифры - PullRequest
0 голосов
/ 20 января 2019

У меня есть фрейм данных test со столбцом category, содержащим сложную комбинацию слов, символов и цифр.Мне нужно извлечь слова, разделенные дефисом перед другим, а затем цифры в новый столбец sub_category.

Я не эксперт по регулярным выражениям и потратил слишком много времени на борьбу с ним.Так что оценим вашу помощь!

test = pd.DataFrame({
    'id': ['1','2','3','4'],
    'category': ['worda-wordb-1234.ds.er89.',
    'worda-4567.we.77-ty','wordc-wordd-5698/de/','wordc-2356/rt/']
    })

Желаемый вывод:

    id  category                sub_category
0   1   worda-wordb-1234.ds.er  worda-wordb
1   2   worda-4567.we.ty        worda
2   3   wordc-wordd-5698/de/    wordc-wordd
3   4   wordc-2356/rt/          wordc

Ответы [ 3 ]

0 голосов
/ 20 января 2019

То, что вы хотите - это просто начало строки и как можно больше нецифров, кроме последнего дефиса.Это должно сработать:

^\D+?(?=-\d)

Демо

Объяснение:

  • ^ соответствует началу строки
  • \D+? соответствует не цифрам, но не жадным образом
  • (?=-\d) соответствует дефису, за которым следует цифра;это заставляет предыдущий матч останавливаться.
0 голосов
/ 20 января 2019

Вы можете сделать это также с помощью split():

>>> df
  id                   category
0  1  worda-wordb-1234.ds.er89.
1  2        worda-4567.we.77-ty
2  3       wordc-wordd-5698/de/
3  4             wordc-2356/rt/

Результирующий вывод:

>>> df['sub_category'] = df.category.str.split('-\d+',expand=True)[0]

>>> df
  id                   category sub_category
0  1  worda-wordb-1234.ds.er89.  worda-wordb
1  2        worda-4567.we.77-ty        worda
2  3       wordc-wordd-5698/de/  wordc-wordd
3  4             wordc-2356/rt/        wordc

ИЛИ, как @jezrael предложила с помощью метода split () с небольшими изменениями, указывающими количество разбиений, необходимых для набора данных, здесь только один ...

df['sub_category'] = df.category.str.split('-\d+',n=1).str[0]
0 голосов
/ 20 января 2019

Использовать str.extract,

test['sub-category'] = test.category.str.extract('(.*)-\d+')

    id  category                    sub-category
0   1   worda-wordb-1234.ds.er89.   worda-wordb
1   2   worda-4567.we.77-ty         worda
2   3   wordc-wordd-5698/de/        wordc-wordd
3   4   wordc-2356/rt/              wordc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...