使用Python regex解析Java输出的浮点字符串数组.deepToString

2024-09-24 02:28:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用某人的Java代码,其中关键数据结构是m x n x p数组float[][][]。我需要把它放到Python中;目前我的方法是使用数组.deepToString然后从Python解析文本文件。你知道吗

我被困在如何写一个正则表达式来解析txt。 我能做的是用科学记数法找出所有的浮点数及其相关的指数。 我使用以下模式来执行此操作:

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

这可以很好地用科学记数法捕获由deepToString输出的浮点数。注意这些值都是正的,因为它们是概率。也就是说,我对如何捕捉数字本身没有任何问题。你知道吗

我不能做的是让regex搜索左括号和右括号中的任意数量的浮点数。我试过这个:

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解析为字符串。你知道吗

我找到了一个解决方法,在这里我可以找到所有的括号索引。但我想知道我对正则表达式有什么不了解。你知道吗


Tags: 方法代码txt数据结构科学数组javafloat
2条回答

您拥有的数据是有效的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]]]

使用这些库进行解析比使用regex进行解析更好。你知道吗

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

你可以试试这个。看到了吗演示。你知道吗

https://regex101.com/r/9GergE/1

你的正则表达式有问题吗

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

在最后,在\]之前,没有它所期望的,。你知道吗

相关问题 更多 >