2017-07-27 67 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']