【问题标题】:How to extract certain length of numbers from a string in python? [duplicate]如何从python中的字符串中提取一定长度的数字? [复制]
【发布时间】:2018-02-06 02:06:10
【问题描述】:

我有一个如下所示的数据框:

description     
1906 RES 330 ML
1906 RES 330ML
RES 335 c/6
RES 332 c/12

我想提取数字的三个连续数字并将其保存在新列“volume”中。 我的代码是这样的:

df['volume'] = df['description'].str.extract('([([\d]*[\d]){3,3}?])')

预期结果应该是这样的:

volume
330
330
335
332

但是,它给出的结果是这样的:

volume
1906
1906
335
332

谁能帮我修复这个代码?非常感谢!!!

【问题讨论】:

    标签: python regex string pandas dataframe


    【解决方案1】:

    您正在寻找的正则表达式是 \b[\d]{3}\b

    有关\b 的更多信息,请参阅docs

    【讨论】:

      【解决方案2】:

      可能有点矫枉过正,但如果您想确保不捕获属于 4 位数字的数字,您可以使用这个:

      df['volume'] = df.description.str.extract(r'(?<!\d)(\d{3})(?!\d)', expand=False)    
      print(df)
      
             description volume
      0  1906 RES 330 ML    330
      1   1906 RES 330ML    330
      2      RES 335 c/6    335
      3     RES 332 c/12    332
      

      指定expand=False,以便匹配只返回一个pd.Series


      正则表达式:

      • (?&lt;!\d) - 指定在一组 3 位数字之前的任何内容都不是数字
      • (\d{3}) - 匹配 3 位数字
      • (?!\d) - 指定在一组 3 位数字之后的任何内容都不是数字

      【讨论】:

      • 也许r'(?&lt;!\d)(\d{3,3})(?!\d)'
      • 为什么\d{3,3} 为什么不只是\d{3}
      • @JBone 因为我对正则表达式还比较缺乏经验。感谢您的指正。我会把它添加进去。
      【解决方案3】:

      你需要

      • 不匹配任意位数,三遍,所以删除[\d]*
      • 不匹配任何看起来像“单词”的内容中的 3 位数字,
        尤其是其他数字,所以使用字边界\b
      • 不允许可选?
      • 不要过度使用字符集[]

      您不需要:

      • 使用两个捕获组()

      这个正则表达式会单独找到三个数字:

      \b(\d{3})\b
      

      【讨论】:

        猜你喜欢
        • 2017-11-06
        • 1970-01-01
        • 2022-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多