我现在正在尝试从字符串中提取大小,这是一个非常常见的模式我猜: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来提取这些数字? 感谢。
答案 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']