如何在python中从字符串中提取特定长度的数字?
我有一个数据框,看起来像这样:如何在python中从字符串中提取特定长度的数字?,python,regex,string,pandas,dataframe,Python,Regex,String,Pandas,Dataframe,我有一个数据框,看起来像这样: description 1906 RES 330 ML 1906 RES 330ML RES 335 c/6 RES 332 c/12 df['volume'] = df['description'].str.extract('([([\d]*[\d]){3,3}?])') 我想提取三个连续数字,并将其保存在新的“volume”列中。 我的代码如下: description 1906 RES 330 ML 1906 RES 330ML RE
description
1906 RES 330 ML
1906 RES 330ML
RES 335 c/6
RES 332 c/12
df['volume'] = df['description'].str.extract('([([\d]*[\d]){3,3}?])')
我想提取三个连续数字,并将其保存在新的“volume”列中。
我的代码如下:
description
1906 RES 330 ML
1906 RES 330ML
RES 335 c/6
RES 332 c/12
df['volume'] = df['description'].str.extract('([([\d]*[\d]){3,3}?])')
预期结果如下:
volume
330
330
335
332
然而,它给出了如下结果:
volume
1906
1906
335
332
有人能帮我修复这个代码吗?非常感谢 可能有些过分,但如果您想确保不捕获属于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返回
正则表达式:
? - 指定在一组3位数之前的任何内容都不是数字
\d{3}-匹配3位数字
?!\d-指定在一组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返回
正则表达式:
? - 指定在一组3位数之前的任何内容都不是数字
\d{3}-匹配3位数字
?!\d-指定在一组3位数字之后的任何内容都不是数字
你需要
不匹配任何数字,三次,因此删除[\d]*
不匹配任何看起来像单词的3位数字,
尤其是其他数字,请使用单词边界\b
不允许可选?
不要过度使用字符集[]
您不需要:
使用两个捕获组
此正则表达式将仅找到三位数字:
\b(\d{3})\b
你需要
不匹配任何数字,三次,因此删除[\d]*
不匹配任何看起来像单词的3位数字,
尤其是其他数字,请使用单词边界\b
不允许可选?
不要过度使用字符集[]
您不需要:
使用两个捕获组
此正则表达式将仅找到三位数字:
\b(\d{3})\b
你要找的正则表达式是 \b[\d]{3}\b
有关\b的详细信息,请参见您要查找的正则表达式是 \b[\d]{3}\b
有关\b的更多信息,请参见可能是r'?为什么\d{3,3}为什么不只是\d{3}?@JBone,因为我对正则表达式还相对缺乏经验。谢谢你的更正。我会把它加进去。也许r’?为什么不仅仅是\d{3,3}?@JBone,因为我对正则表达式还比较缺乏经验。谢谢你的更正。我会加进去的。