Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式:提取分隔数字的正确方法(AxBxC->;[A,B,C])_Python_Regex_String_Extraction - Fatal编程技术网

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

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

我现在尝试从字符串中提取大小,我想这是一种非常常见的模式: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', '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']