用正则表达式在连字符后接数字前提取字符串的一部分

时间:2019-01-20 16:37:13

标签: python regex python-3.x pandas

我有一个数据框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 :(得分:2)

使用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

答案 1 :(得分:1)

您想要的只是字符串的开头和尽可能多的非数字,最后一个连字符除外。这应该可以解决问题:

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

Demo

说明:

  • ^匹配字符串的开头
  • \D+?匹配非数字,但以非贪婪的方式匹配
  • (?=-\d)匹配一个连字符,后跟一个数字;这将迫使上一场比赛停止。

答案 2 :(得分:1)

您也可以使用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

OR,如@jezrael在split()方法中建议的那样,几乎没有更改,它指定了数据集所需的分割数,此处仅此一个...

df['sub_category'] = df.category.str.split('-\d+',n=1).str[0]