2017-07-27 69 views
1

我現在試圖從字符串中提取大小,這是一個非常常見的模式,我猜:AxBxC其中A,B,下用X分離(可能是X具有空間也),是尺寸(整數或浮點數):Python正則表達式:正確的方法來提取分離的數字(AxBxC - > [A,B,C])

import re 

s = 'zzz 3062 0.2 aaa 15.8x20.2x12.2875 mm' 

我期待獲得在線訂購三個數字:15.8,20.2,12.2875] 唯一的工作方法我現在是醜陋的:

r1 = re.findall('(\d+\.?\d*)\ *x\ *', s) 
r2 = re.findall('\ *x\ *(\d+\.?\d*)', s) 
r1.extend(r2) 
print(set(r1)) 

{'15.8', '20.2', '12.2875'} 

有沒有什麼辦法可以使用單一健壯正則表達式提取這些數字? 謝謝。

+0

不會'\ d + \ * \ d +'夠嗎?這應該得到除了小數點以外的任何數字。 對於例如你找到[3062,0.2,15.8,20.2,12.2875] – Zinki

+0

@Zinki號將得到那些'3062'和'0.2'了。 –

+0

也許're.findall(R '(\ d [\ d] *)×(\ d [\ d] *)×(\ d [\ d] *)',S)'?這些數字總是三倍,不是嗎?看[正則表達式演示](https://regex101.com/r/0K5v5P/1)。 –

回答

1

看來你需要匹配2或3 x分離的浮點值。您可以使用

r'(\d[\d.]*)x(\d[\d.]*)(?:x(\d[\d.]*))?' 

regex demo

詳細

  • (\d[\d.]*) - 第1組:一個數字,然後0+數字和/或.
  • x - 文字x
  • (\d[\d.]*) - 組2:一個數字,然後0+數字或/和.
  • (?:x(\d[\d.]*))? - 的x(\d[\d.]*)可選序列,x接着與第3組捕獲一個數字,然後0+數字或/和.

在Python,使用

re.findall(r'(\d[\d.]*)x(\d[\d.]*)(?:x(\d[\d.]*))?', s) 
1

這是,如果你不知道你會多少個號碼必須得到一個解決方案:

((?:\d+\.\d+)(?=x)|(?<=x)(?:\d+\.\d+)) 

它是基於這樣的事實,或x是你的電話號碼之前或之後。

1

相反,R1,可以使用以下命令:

r1 = re.split("x", re.findall('\d*\.\d*x\d*\.\d*x\d*\.\d*', s)[0]) 

不幸的是,它仍然存在兩個命令,並通過嵌套這一點,變得有點難以閱讀。 如果你想使用它們作爲數字,他們仍然應該從字符串轉換爲數字,例如對於每個數字float(r1[#])或使用numpy版本轉換整個數組,可以找到here

0

我希望這將有助於你

>>> s.split()[-2].split("x") 
['15.8', '20.2', '12.2875']