使用Python正则表达式解析Java Arrays.deepToString输出的浮点数字符串

7

我正在处理一份Java代码,其中一个关键数据结构是一个m x n x p数组,float[][][]。我需要将它转换成Python格式;目前我的方法是使用Arrays.deepToString将数组保存到文本文件中,然后从Python解析该文本文件。

我在如何编写正则表达式来解析txt文件上遇到了困难。 我可以找到所有科学记数法中的浮点数和其相关指数。 我使用以下模式进行匹配:

float_pat = r'\d\.\d*(?:E-\d+)?'

这段代码可以很好地捕获由deepToString输出的科学计数法中的浮点数。请注意,这些值都是正数,因为它们是概率。也就是说,我没有任何关于如何捕获数字本身的问题。

但是,我想做但无法做到的是使用正则表达式在左右括号中查找任意数量的浮点数。我尝试了以下方法:

list_of_floats_pat = r'\[(?:\d\.\d*(?:E-\d+)?), )+\]'

我正在尝试查找一个或多个浮点格式后跟由方括号括起来的逗号和空格。 但是它返回[]。 不确定我的理解有什么问题。

以下是一个2x1x1数组的示例:

[[[0.6453525160688715, 0.15620941152962334, 0.1874313118193626, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 0.01050721017750691, 9.991008092716556E-5], [0.5904776610141782, 0.18175460267577365, 9.991008092716556E-5, 0.22716827582448523, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5]]]

我希望正则表达式能够返回两个匹配结果:

0.6453525160688715, 0.15620941152962334, 0.1874313118193626, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 0.01050721017750691, 9.991008092716556E-5

并且

0.5904776610141782, 0.18175460267577365, 9.991008092716556E-5, 0.22716827582448523, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5

我可以将其作为字符串使用strip和split进行解析。

我已经想出了一种解决方法,即查找所有括号索引。但我想知道我没有理解正则表达式的地方。

2个回答

4
您手头的数据既是有效的 Python 代码,也是有效的 JSON 格式:
>>> s = '[[[0.6453525160688715, 0.15620941152962334, 0.1874313118193626, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 0.01050721017750691, 9.991008092716556E-5], [0.5904776610141782, 0.18175460267577365, 9.991008092716556E-5, 0.22716827582448523, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5]]]'
>>> ast.literal_eval(s)
[[[0.6453525160688715, 0.15620941152962334, 0.1874313118193626, 9.991008092716556e-05, 9.991008092716556e-05, 9.991008092716556e-05, 9.991008092716556e-05, 0.01050721017750691, 9.991008092716556e-05], [0.5904776610141782, 0.18175460267577365, 9.991008092716556e-05, 0.22716827582448523, 9.991008092716556e-05, 9.991008092716556e-05, 9.991008092716556e-05, 9.991008092716556e-05, 9.991008092716556e-05]]]
>>> json.loads(s)
[[[0.6453525160688715, 0.15620941152962334, 0.1874313118193626, 9.991008092716556e-05, 9.991008092716556e-05, 9.991008092716556e-05, 9.991008092716556e-05, 0.01050721017750691, 9.991008092716556e-05], [0.5904776610141782, 0.18175460267577365, 9.991008092716556e-05, 0.22716827582448523, 9.991008092716556e-05, 9.991008092716556e-05, 9.991008092716556e-05, 9.991008092716556e-05, 9.991008092716556e-05]]]

相比于尝试使用正则表达式进行解析,使用那些库会更加有效。


运行得非常好。我有一种感觉,答案是“不要使用正则表达式,因为有更简单的方法”。谢谢。 - NickleDave

3
\[(?:\d\.\d*(?:E-\d+)?)(?:, (?:\d\.\d*(?:E-\d+)?))*\]

你可以尝试这个。查看演示。 https://regex101.com/r/9GergE/1 你的正则表达式存在问题。
\[(?:\d\.\d*(?:E-\d+)?), )+\]

在末尾的\]之前没有,,这是它期望的。


明白了,我需要再加一个逗号,因为括号内的数组本身也是用逗号分隔的。谢谢,这帮助我理解了。 - NickleDave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接