Python正则表达式:提取分隔数字的正确方法(AxBxC - > [A,B,C])

时间:2017-07-27 12:43:13

标签: python regex string extraction

我现在正在尝试从字符串中提取大小,这是一个非常常见的模式我猜:AxBxC其中A,B,C用x分隔(也可能是带空格的x),是大小(int或float) :

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'}

有没有办法使用单个强大的regexp来提取这些数字? 感谢。

4 个答案:

答案 0 :(得分:1)

如果你不知道要获得多少数字,这是一个解决方案:

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

它基于以下事实:或者x在您的号码之前或之后。

答案 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)

答案 2 :(得分:1)

相反,对于r1,您可以使用以下内容:

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

不幸的是,它仍然存在两个命令,并且通过嵌套它,它变得有点难以阅读。 如果你想将它们用作数字,它们仍然应该从字符串转换为数字,例如对于每个数字float(r1[#])或使用numpy版本转换整个数组,可以找到here

答案 3 :(得分:0)

我希望这会对你有所帮助

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