Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中从字符串中提取特定长度的数字?_Python_Regex_String_Pandas_Dataframe - Fatal编程技术网

如何在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,因为我对正则表达式还比较缺乏经验。谢谢你的更正。我会加进去的。