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.]*))?'
详情
(\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']
我现在正尝试从字符串中提取大小,我猜这是一种非常常见的模式: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.]*))?'
详情
(\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']