2016-12-25 18 views
7

Tôi đang làm việc với mã Java của ai đó trong đó cấu trúc dữ liệu chính là một mảng m x n x p, float[][][]. Tôi cần đưa nó vào Python; hiện tại cách tiếp cận của tôi là lưu mảng vào một tệp văn bản bằng cách sử dụng Arrays.deepToString và sau đó phân tích cú pháp tệp văn bản đó từ Python.Sử dụng Python regex để phân tích cú pháp chuỗi đầu ra nổi bằng Java Arrays.deepToString

Tôi bị kẹt về cách viết biểu thức chính quy sẽ phân tích cú pháp txt. Điều tôi có thể làm là tìm tất cả các phao có số mũ liên quan của chúng trong ký pháp khoa học. tôi sử dụng mô hình sau đây để làm như vậy:

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

này hoạt động tốt để nắm bắt nổi trong ký hiệu khoa học khi họ được xuất ra bởi deepToString. Lưu ý rằng tất cả các giá trị đều dương vì chúng là xác suất. Tức là, tôi không có bất kỳ vấn đề gì với cách tôi tự ghi lại các con số.

Điều tôi không thể làm nhưng những gì tôi muốn làm là tìm kiếm regex cho bất kỳ số lượng float nào được đặt trong dấu ngoặc trái và phải. Tôi đã thử điều này:

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

nơi tôi đang cố gắng tìm một hoặc nhiều trường hợp định dạng nổi theo sau dấu phẩy và khoảng trắng được bao quanh bởi dấu ngoặc vuông. Nhưng điều đó trả về []. Không chắc những gì tôi không hiểu.

Dưới đây là một mảng 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]]] 

Những gì tôi muốn là cho regex để trở lại hai trận đấu:

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 

mà tôi có thể sau đó chỉ cần phân tích cú pháp dưới dạng các chuỗi có dải và phân tách.

Tôi đã tìm ra một giải pháp thay thế nơi tôi chỉ tìm thấy tất cả các chỉ mục khung. Nhưng tôi muốn biết những gì tôi không hiểu về regex.

Trả lời

4

Các dữ liệu mà bạn có là cả python hợp lệ và json hợp lệ:

>>> 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]]] 

Bạn sẽ được tốt hơn off phân tích với những thư viện hơn là cố gắng làm như vậy với regex.

+0

Làm việc như một sự quyến rũ.Tôi có cảm giác câu trả lời là 'đừng dùng regex vì có điều gì đó ít đau đớn hơn'. ty. – NickleDave

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

Bạn hãy thử bản trình diễn này.See.

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

Vấn đề với regex của bạn

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

là vào cuối ngay trước \] không có , mà nó được mong đợi.

+0

OK, tôi cần một dấu phẩy khác vì các mảng được gắn kết được phân cách bằng dấu phẩy. cảm ơn bạn, điều đó đã giúp tôi hiểu được – NickleDave

Các vấn đề liên quan