2017-08-28 313 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

相關問題