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

Posted

技术标签:

【中文标题】使用 Python 正则表达式解析 Java Arrays.deepToString 输出的浮点字符串【英文标题】:Use Python regex to parse string of floats output by Java Arrays.deepToString 【发布时间】:2017-05-10 11:25:12 【问题描述】:

我正在使用某人的 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 的字符串。

我想出了一个解决方法,我只需找到所有括号索引。但我想知道我对正则表达式不了解的地方。

【问题讨论】:

【参考方案1】:

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

与尝试使用正则表达式相比,使用这些库进行解析会更好。

【讨论】:

工作就像一个魅力。我有一种感觉,答案是“不要使用正则表达式,因为有些东西不那么痛苦”。泰。【参考方案2】:
\[(?:\d\.\d*(?:E-\d+)?)(?:, (?:\d\.\d*(?:E-\d+)?))*\]

你试试这个。查看演示。

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

你的正则表达式的问题

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

是不是在\] 之前的最后没有它所期望的,

【讨论】:

知道了,我需要另一个逗号,因为括号中的数组本身是用逗号分隔的。谢谢,这帮助我理解了

以上是关于使用 Python 正则表达式解析 Java Arrays.deepToString 输出的浮点字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python 使用正则表达式解析 HTML

Python 使用正则表达式解析日志

java的正则表达式解析

将正则表达式解析为 AST 的 Python 库?

Python正则表达式解析流

使用正则表达式解析表 - Java