2017-08-28 309 views
0

我有一个数据帧,看起来像这样:如何从python中的字符串中提取特定长度的数字?

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

我想提取号的3个连续数字,并将其保存在一个新的列“量”。 我的代码是这样的:

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

预期的结果应该是这样的:

volume 
330 
330 
335 
332 

然而,它给人的结果是这样的:

volume 
1906 
1906 
335 
332 

谁能帮助我解决这个问题码?非常感谢!!!

+0

如果您的问题已得到解答,并且您在此处使用了其中一种解决方案,则可以[标记该答案接受](https://stackoverflow.com/help/someone-answers)。谢谢,祝你好运。 –

+0

可能重复的[从字符串中得到一个精确到x位的数字](https://stackoverflow.com/questions/15311619/get-a-number-with-exactly-x-digits-from-string) – Tezra

回答

3

可能是矫枉过正,但如果你要确保你没有捕捉到的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位数字之后不是一个数字
+0

也许'r '(?<!\ d)(\ d {3,3})(?!\ d)'' –

+0

感谢您的改进!将编辑。 –

+0

为什么'\ d {3,3}'为什么不只是'\ d {3}'? – JBone

2

你需要

  • 不匹配任何数量的数字,三次,所以删除[\d]*
  • 没有什么内匹配3个数字看起来像一个“字”,
    特别是没有其他的数字,所以在使用字边界\b
  • 不允许可选?
  • 过分的字符集的事情[]

你并不需要:

  • 使用两个捕获组()

此正则表达式会准确地找到三位,独自一人

\b(\d{3})\b 
0

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

有关的更多信息参见docs

相关问题