使用 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 输出的浮点字符串的主要内容,如果未能解决你的问题,请参考以下文章