我有一个如下所示的数据框:
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
任何人都可以帮我修复此代码吗?非常感谢!!!
答案 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]*
\b
?
[]
您不需要:
()
这个正则表达式只能找到三个数字:
\b(\d{3})\b
答案 2 :(得分:0)
你正在寻找的正则表达式是
\b[\d]{3}\b
有关\b
的更多信息,请参阅docs