【问题标题】:Match number in python using re使用re匹配python中的数字
【发布时间】:2017-06-08 14:50:29
【问题描述】:

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

(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')]
...

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

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

【问题讨论】:

  • 都是数字部分!!您在这里拥有的是复数。 j 代表 sqrt(-1)
  • 还想使用正则表达式吗?好的,然后查看我的更新答案:)

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


【解决方案1】:

这些是数字。你不应该在这里使用正则表达式。第一部分是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()。

【讨论】:

  • 你可以做cmath.sqrt(-1)
  • 嗯,我确实知道复数,但是这些是从文件中读取的(抱歉一开始没有提到),所以我不知道如何处理它......我试过了eval() 根据您的建议,但我得到了 unexpected EOF while parsing ...
  • 抱歉,我知道了:complex() arg is a malformed string ... 有什么问题...
  • 是的,在处理完空间后已修复,非常感谢!
  • 很高兴能帮上忙。祝您的项目一切顺利。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多