2016-12-25 25 views
7

Bir anahtar veri yapısının m x n x p dizisi, float[][][] olduğu bir kişinin Java koduyla çalışıyorum. Python'a almam gerek; Şu anda benim yaklaşım dizisi Arrays.deepToString kullanarak bir metin dosyasına kaydetmek ve sonra Python gelen bu metin dosyasını ayrıştırmaktır.Java Arrays.deepToString tarafından çıkışların dizgisi ayrıştırmak için Python regex kullanın

Txt'yi ayrıştıracak düzenli bir ifadeyi nasıl yazacağım konusunda takılıyorum.nolu nolu tüm şamandıraları, ilgili göstergeleri bilimsel gösterimde bulabilirsiniz. bunu yapmak için aşağıdaki modelini kullanın: Bu da çıkış deepToString tarafından olduğu gibi bilimsel gösterimde yüzen yakalamak için çalışıyor

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

. Değerlerin hepsi pozitiftir, çünkü olasılıklardır. Evet, sayıları nasıl yakaladığımla ilgili hiçbir sorunum yok.

Ne yapamıyorum ama yapmak istediğim şey, sol ve sağ köşeli parantez içine alınmış herhangi bir sayıdaki döngüleri düzenli olarak aramaktır. Denedim bu: Ben bir veya daha fazla bir virgül ardından şamandıra formatının dava ve köşeli parantez bir boşluk bulmaya çalışıyorum

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

. Ama bu [] döndürür. Anlamadığımdan emin değilim. İşte

bir örnek 2x1x1 dizi var:

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

regex iki maç dönmek için ne isteyeyim: sadece o

0.6453525160688715, 0.15620941152962334, 0.1874313118193626, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 0.01050721017750691, 9.991008092716556E-5 

ve

0.5904776610141782, 0.18175460267577365, 9.991008092716556E-5, 0.22716827582448523, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5, 9.991008092716556E-5 

elimden şerit ve bölünmüş dizeleri olarak ayrıştırma.

Tüm parantez dizinlerini bulduğum bir çözüm buldum. Ama regeeksler hakkında anlamadığım şeyi bilmek isterim.

cevap

4

veriler geçerli piton ve geçerli json hem:

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

Sen regex ile bunu çalışmak yerine bu kitaplıkları ile ayrıştırma için daha iyi olur.

+0

bir çekicilik gibi çalıştı yardımcı oldu.Cevabın “regex kullanmayın çünkü daha az acı verici bir şey olduğu” hissine kapıldım. Ty. – NickleDave

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

Bir this.See demo deneyin. senin regex

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

ile

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

sorun sadece \] önce sonunda o bekliyordum hiçbir , olduğunu oldu. Sahip

+0

Anladım, köşeli diziler kendileri virgülle ayrılmış oldukları için başka bir virgül kullanmalıydık. teşekkür ederim, bu bana – NickleDave