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

Python Regex: Proper way to extract separated numbers (AxBxC -> [A, B, C])

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

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

有什么方法可以使用单一的稳健正则表达式来提取这些数字吗? 谢谢

如果您不知道必须得到多少个数字,这是一个解决方案:

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

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

您似乎需要匹配 2 或 3 个 x 分隔的浮点值。您可以使用

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

regex demo

详情

  • (\d[\d.]*) - 第 1 组:一个数字,然后是 0+ 个数字 or/and .
  • x - 文字 x
  • (\d[\d.]*) - 第 2 组:一个数字,然后是 0+ 个数字 or/and .
  • (?:x(\d[\d.]*))? - x(\d[\d.]*) 的可选序列,x 后跟第 3 组捕获一个数字,然后是 0+ 个数字 or/and .

在Python中,使用

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

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

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

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

希望对您有所帮助

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