如何从python中的字符串中提取一定数量的数字?

时间:2017-08-28 18:19:31

标签: python regex string pandas dataframe

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

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

任何人都可以帮我修复此代码吗?非常感谢!!!

3 个答案:

答案 0 :(得分:5)

可能有点矫枉过正,但是如果你想确保你没有捕获属于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

正则表达式:

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

答案 1 :(得分:2)

你需要

  • 不匹配任意数量的数字,三次,因此请删除[\d]*
  • 不匹配任何看起来像&#34;字&#34;,
    的3个数字 特别是其他数字,所以请使用单词边界\b
  • 不允许选择?
  • 不要过度使用字符集[]

您不需要:

  • 使用两个捕获组()

这个正则表达式只能找到三个数字:

\b(\d{3})\b

答案 2 :(得分:0)

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

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