使用re在python中匹配数字

时间:2017-06-08 14:50:29

标签: python regex string python-3.x complex-numbers

我收到了很多以这种形式写的数据(从文件中读取):

(31265+0j)
(-5613.54281374+404.957401125j)
(1371.65134844+2671.06617046j)
...

然而我想提取数字部分,比如[31265, 0][-5613.54281374 , 404.957401125],我在python中以我认为可行的方式编码:

re.findall(r'.*([\+|\-]?\d+.?\d+)([\+|\-]?\d+.?\d+).*', tempStr)

但它不起作用,它给了我这个:

[]
[('26', '5+0')]
[('11', '25')]
...

它有什么问题?它是关于懒惰模式的吗?我该如何解决?

========================更新====================== == 对我来说,这个问题已经解决了,但我仍然想知道正则表达式部分有什么问题,是否有人愿意帮助我指出正则表达式模式的错误?

2 个答案:

答案 0 :(得分:6)

这些是数字。你不应该在这里使用正则表达式。第一部分是real,第二部分是imaginary,您可以像这样访问它们

 n = (-5613.54281374+404.957401125j)
 n.real
 n.imag

起初可能很难发现,因为在数学中我们经常使用i = sqrt(-1)但在python中它是j = sqrt(-1)但是有趣的是,如果你这样做了

import math
math.sqrt(-1) 

您将获得ValueError

<强>更新

如果数据在文件中

with open('complex.txt') as f:
    for line in f:
        number = complex(line.strip())

更新2: 如果你真的,真的,真的想要使用正则表达式:

 map(float, line[1:-2].split('+'))

如果您有复数部分可以为负数的数字,请使用re.split()。

答案 1 :(得分:1)

使用.real和.imag将为您提供所需的输出

   foo = (31265 + 0j)
   bar = [foo.real , bar.imag]
   #>>>[31265.0 , 0.0]