2017-06-21 159 views
1

我有Java程序調用Python腳本並將Python字典的結果作爲字符串。結果會是這樣的:用Java拆分Python字典字符串

{'27': [], '10864': [u'8344', u'7769', u'7207', u'3735']} 

我想分析結果到兩個字符串表中的鍵和返回的值。在這個例子中,我想:

String[] keys >>>> ["27",'10864'] and 

String[] values >>>> ["[]","[u'8344', u'7769', u'7207', u'3735']"] 

我想用正則表達式來做,但我沒有太大的成功。任何人都可以提供有效的解決方

+4

爲什麼不返回一個JSON和分析呢? –

+0

我把python結果寫在一個字典中,我在Java中使用類似於 的字符串puthonKeys = interpreter.eval(「results」)。toString(); 。你是否建議從字典中創建一個JSON對象,將它轉換爲字符串並從Java中評估它? –

回答

1

由於要使用的正則表達式,這裏是one approach

import java.util.*; 

class Main { 
    public static void main(String[] args) { 
    String strExample = "{'27': [], '10864': [u'8344', u'7769', u'7207', u'3735']}"; 

    // Initialize 
    List<String> keys = new ArrayList<String>(); 
    List<String> values = new ArrayList<String>(); 

    // Hacky regex parsing -- happy now??? 
    for (String component : strExample.replace("{","").split("][,}]")) { 
     String kv[] = component.split(": "); 
     keys.add(kv[0]); 
     values.add(kv[1] + "]"); 
    } 

    // Print 
    System.out.println("Keys: "); 
    for (String key : keys) { 
     System.out.println(key); 
    } 
    System.out.println("\nValues: "); 
    for (String value : values) { 
     System.out.println(value); 
    } 

    } 

} 

在閉合托架]然後結腸該第一分割:

輸出是你所需的(run in repl):

鍵:

'27'

'10864'

值:

[]

[u'8344' ,u'7769' ,u'7207' ,u'3735' ]

注意,你真的應該

  1. 的數字鍵

  2. 使用正則表達式使用字符串來解析JSONs

  3. 在實際系統中使用這樣的事情代碼

2

你可以看到我用here on regex101.com正則表達式。

本質上,匹配器將貫穿您的輸入並檢測正則表達式的所有匹配。然後在while循環中使用.find方法分別遍歷每個匹配並提取信息。

您可以使用常規數組,但在我看來,如果您不確定傳入輸入的大小,使用ArrayList會更有效。

此代碼的工作對我來說:

 public static void main(String[] args) 
{ 
    String input = "{'27': [], '10864': [u'8344', u'7769', u'7207', u'3735']}"; 
    String pattern = "('([\w]*)': (\\[[u'0-9, ]*])?)"; 

    List<String> keys = new ArrayList<>(); 
    List<String> values = new ArrayList<>(); 

    //Find multiple matches in your input. 
    Matcher m = Pattern.compile(pattern).matcher(input); 

    //Goes through each match individually. 
    while (m.find()) 
    { 
     keys.add(m.group(2)); 
     values.add(m.group(3)); 

    } 

    //To display your keys and values. 
    System.out.println("Keys: " + keys.toString()); 
    System.out.println("Values: " + values.toString()); 

} 
+0

thnx的解決方案,但我沒有隻有數字作爲鍵值。我可以有一些「{'randomId':[],......} –

+0

@PennT你也可以有一個字母字符?編輯:我改變了我的解決方案,所以它允許字母字符 – MinistryofChaps

+1

@PennT變量' ''我'''沒有使用,但很好的解決方案。 –