Python正则表达式:提取分隔数字的正确方法(AxBxC->;[A,B,C])
我现在尝试从字符串中提取大小,我想这是一种非常常见的模式:AxBxC,其中a、B、C用x分隔(也可能是x加空格),是大小(int或float): 我只希望获得三个数字:[15.8、20.2、12.2875] 我现在唯一的工作方法是丑陋:Python正则表达式:提取分隔数字的正确方法(AxBxC->;[A,B,C]),python,regex,string,extraction,Python,Regex,String,Extraction,我现在尝试从字符串中提取大小,我想这是一种非常常见的模式:AxBxC,其中a、B、C用x分隔(也可能是x加空格),是大小(int或float): 我只希望获得三个数字:[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', '1
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来提取这些数字?
谢谢。如果您不知道需要获得多少号码,这是一个解决方案:
((?:\d+\.\d+)(?=x)|(?<=x)(?:\d+\.\d+))
(((?:\d+\.\d+)(?似乎需要匹配2或3个x
分隔的浮点值。您可以使用
r'(\d[\d.]*)x(\d[\d.]*)(?:x(\d[\d.]*))?'
见
详细信息
(\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)
相反,对于r1,您可以使用以下选项:
r1 = re.split( "x", re.findall('\d*\.\d*x\d*\.\d*x\d*\.\d*', s )[0] )
不幸的是,它仍然存在两个命令,通过嵌套这两个命令,它变得有点难以阅读。
如果您想将它们用作数字,则仍应将它们从字符串转换为数字,例如,对于每个数字float(r1[#])
或使用numpy版本转换整个数组,可以找到它们。我希望这将对您有所帮助
>>> s.split()[-2].split("x")
['15.8', '20.2', '12.2875']
\d+\.*\d+
不够吗?这应该得到除小数点以外的任何数字。例如,它会找到[3062,0.2,15.8,20.2,12.2875]@Zinki No。它也会得到那些3062
和0.2
。可能re.findall(r'(\d[\d.]*)x(\d[\d.]*)x(\d[\d.]*),s)
?这些数字总是以三元组的形式出现,不是吗?看。是的,这很好,但是如果我们有AxB(只有两个维度)?将第三个设置为可选-,它将返回('15.8','20.2','')
>>> s.split()[-2].split("x")
['15.8', '20.2', '12.2875']