【问题标题】:Match a substring in Pandas wit str.extract method使用 str.extract 方法匹配 Pandas 中的子字符串
【发布时间】:2017-02-20 23:30:05
【问题描述】:

我有一个看起来像这样的字符串:

29818-218705-61709-2    

我想提取两个破折号之间倒数第二个数字

61709

每个字符串都包含在一个熊猫系列中:

我想出了:

df.id.str.extract(r'[.-]([0-9]{5})[.-]?')

但它会提取前 5 位数字组。

我可以匹配我想要的吗?

【问题讨论】:

    标签: python regex string pandas


    【解决方案1】:

    你可以使用

    [.-]([0-9]{5})[.-][0-9]+$
    

    this regex demo

    详情

    • [.-] - .- 分隔符
    • ([0-9]{5}) - 第 1 组捕获 5 位数字
    • [.-] - 又是一个分隔符
    • [0-9]+ -1+ 位
    • $ - 字符串结束。

    感谢$ 锚点,匹配最后的数字组。

    另一种方法是利用回溯:

    ^.*[.-]([0-9]{5})[.-]
    

    this demo

    ^.* 将尽可能多地匹配字符串开头除换行符以外的任何 0+ 字符,因此匹配最后一个 -|.+5 digits+-|.

    【讨论】:

    • 很高兴它对你有用。如果对您有帮助,也请考虑对答案进行投票。
    【解决方案2】:

    你可以使用split

    df.id.str.split('-').str[-2]
    

    演示

    df = pd.DataFrame(dict(id=['29818-218705-61709-2'] * 1000)) 
    df.id.str.split('-').str[-2].head()
    
    0    61709
    1    61709
    2    61709
    3    61709
    4    61709
    Name: id, dtype: object
    

    【讨论】:

    • 我的想法是一样的 ;)
    【解决方案3】:

    你可以试试:

    >>> s = "29818-218705-61709-2 "
    >>> s.split("-")[2]
    '61709'
    

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 1970-01-01
      • 2019-07-27
      • 2021-02-23
      • 2016-06-09
      • 2019-10-24
      • 2015-12-28
      • 2017-12-12
      • 1970-01-01
      相关资源
      最近更新 更多