python - 从日志文件转换矩阵

标签 python regex numpy

我在日志文件中以这种格式编写了一个矩阵:

2014-09-08 14:10:20,107 - root - INFO - [[  8.30857546   0.69993454   0.20645551  
77.01797674  13.76705776]
 [  8.35205432   0.53417203   0.19969048  76.78598173  14.12810144]
 [  8.37066492   0.64428449   0.18623849  76.4181809   14.3806312 ]
 [  8.50493296   0.5110043    0.19731849  76.45838604  14.32835821]
 [  8.18900791   0.4955451    0.22524777  76.96966663  14.12053259]]
...some text 
2014-09-08 14:12:22,211 - root - INFO - [[  3.25142253e+01   1.11788106e+00   1.51065008e-02   6.16496299e+01
    4.70315726e+00]
 [  3.31685887e+01   9.53522041e-01   1.49767860e-02   6.13449154e+01
    4.51799710e+00]
 [  3.31101827e+01   1.09729703e+00   5.03347259e-03   6.11818594e+01
    4.60562742e+00]
 [  3.32506957e+01   1.13837592e+00   1.51783456e-02   6.08651657e+01
    4.73058437e+00]
 [  3.26809490e+01   1.06617279e+00   1.00110121e-02   6.17429172e+01
    4.49994994e+00]]

我正在使用 python 日志记录包编写这个矩阵:

logging.info(conf_mat)

但是,logging.info 没有向我展示以 float %.3f 格式编写矩阵的方法。所以我决定这样解析日志文件:

conf_mat = [[]]
cf = '[+-]?(?=\d*[.eE])(?=\.?\d)\d*\.?\d*(?:[eE][+-]?\d+)?'

with open(sys.argv[1]) as f:
    for line in f:
        epoch = re.findall(ep, line) # find lines starting with epoch for other stuff
        if epoch:
            error_line = next(f) # grab the next line, which is the error line
            error_value = error_line[error_line.rfind('=')+1:]
            data_points.append(map(float,epoch[0]+(error_value,))) #get the error value for the specific epoch
            for i in range(N):
                cnf_mline = next(f)
                match = re.findall(cf, cnf_mline)
                if match:
                    conf_mat[count].append(map(float,match))
                else:
                    conf_mat.append([])
                    count += 1

但是,当我尝试使用转换矩阵时,正则表达式在查看矩阵时不会捕获行中的中断

conf_mtx = np.array(conf_mat)

最佳答案

您的正则表达式字符串 cf 需要是原始字符串文字:

cf = r'[+-]?(?=\d*[.eE])(?=\.?\d)\d*\.?\d*(?:[eE][+-]?\d+)?'

为了正常工作。反斜杠\字符被解释为“常规”字符串中的转义序列,但不应出现在正则表达式中。您可以在re module's documentation顶部阅读有关原始字符串文字的信息。 ,并且在这个优秀的SO answer 。 Alex Martelli 解释得很好,所以我不会在这里重复他所说的一切。我只想说,如果你不使用原始文字,你就必须用另一个反斜杠转义每一个反斜杠,而这很快就会变得丑陋和烦人。

至于代码的其余部分,如果没有更多信息,它将无法运行。 for i in range(N): 中的 N 未定义,几行后的 count 也是如此。调用 cnf_mline = next(f) 确实没有任何意义,因为您将在之前用完文件中的行(通过重复调用 next)您可以使用 for line in f: 命令迭代所有这些。目前尚不清楚您的数据是否确实在后半部分有换行符,其中列表的一个成员位于下一行,我认为由于 next 尝试就是这种情况。

我认为您应该首先尝试将输入文件清理为常规范式,然后您将可以更轻松地在其上运行正则表达式。为了处理后续行并且不过度使用 next() 来运行生成器表达式,请查看 itertools.tee() 。它从单个迭代返回n个独立的生成器,允许您将第二个生成器向前移动到第一个生成器之前。或者,您可以将文件的行读入列表中,然后仅使用 i, i+1 的索引进行操作。只需剥离每一行,将它们连接在一起,然后写入新文件或列表。然后,您可以继续重写匹配循环,以简单地拉出适当格式的每个数字并将其插入到矩阵的正确位置。好消息是你的正则表达式捕获了我向它抛出的所有内容,因此你不需要在那里修改任何内容。

祝你好运!

关于python - 从日志文件转换矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25903120/

相关文章:

python - 读取大型 CSV 并将其分割成更小的 block

python - 从时间中减去小时和分钟

python - 如何在 Python 中考虑正则表达式的重音字符?

regex - excel VBA 正则表达式 5.5 捕获组

python - (M,M,N) 或类似数组中连续方阵的累积矩阵乘法?

python - 使用 numpy 和 lstsq 求解 3 维系统

python - 在 selenium 下运行时如何减少 chromedriver 日志的冗长?

java - 解析 QIF 文件 - .NET 移植到 Java

python - 使用 For 循环在 dataFrame 中查找 float

python - 检查列表的元素是否包含另一个列表的所有元素的有效方法