2015-09-05 21 views
4

匹配,我有以下字符串key1=[subKey1=[val1,val2=[k1,k2]],val3,val4,subKey2=[aaa,bbb]],key2=val5,key3,key4=[1,2,3]我不得不解析字符串,過程在一個循環中找到的數據。如何修復正則表達式來我的字符串

我寫這個正則表達式:(([^=]+)=(\[(\S+)\],?|[a-z0-9-_]+))|([a-z0-9-_]+)但它不能捕捉key1部分原因是key4表達]人物,如何解決我的正則表達式來匹配字符串結束\

regex=re.compile('(([^=]+)=(\[(\S+)\],?|[a-z0-9-_]+))|([a-z0-9-_]+)') 
string="key1=[subKey1=[val1,val2=[k1,k2]],val3,val4,subKey2=[aaa,bbb]],key2=val5,key3,key4=[1,2,3]" 

for i in regex.findall(string): 
    #Do Stuff 
+0

@pasabaporaqui IM做的蟒蛇 – PYPL

+0

什麼是您預期的輸出? –

+0

@AruneshSingh得到所有匹配的數據,並用它在一個循環中,像第一應該找到所有'key1'數據,那麼'key2'的和至死不渝 – PYPL

回答

2

正則表達式是不適宜解析?任何有遞歸模式的東西。改爲使用真正的上下文無關語言分析器。否則,你必須將你的語言限制爲更簡單的格式。

,或是嘗試使用替代其轉換爲一個JSON格式,並使用JSON解析器。

+0

這是一段時間,因爲我問過這個問題,但是今天我不得不考慮這個項目再次......不得不承認,正則表達式是不與這樣的配置文件格式工作的最佳解決方案,所以我切換到完全XML。 – PYPL

1
import regex 
x="key1=[subKey1=[val1,val2=[k1,k2]],val3,val4,subKey2=[aaa,bbb]],key2=val5,key3,key4=[1,2,3]" 
print [i for i,j in regex.findall("([^,=]+=(\[(?:[^\[\]]|(?2))+\])|[^,]*)",x) if i] 

使用recursive regex可在regex模塊。

輸出:['key1=[subKey1=[val1,val2=[k1,k2]],val3,val4,subKey2=[aaa,bbb]]', 'key2=val5', 'key3', 'key4=[1,2,3]']

0

下面是一個使用Python的ast.literal_eval功能略有另一種方法:

import ast, re 

orig_text = """key1=[subKey1=[val1,val2=[k1,k2]],val3,val4,subKey2=[aaa,bbb]],key2=val5,key3,key4=[1,2,3]""" 
quoted_values = re.sub(r'([a-zA-Z0-9]+)', r'"\1"', orig_text) 
assignments_removed = re.sub(r'("[a-zA-Z0-9]+?"\s?=\s*)', '', quoted_values) 

print ast.literal_eval(assignments_removed) 

這將至少給你所有的值如下一起工作:

([['val1', ['k1', 'k2']], 'val3', 'val4', ['aaa', 'bbb']], 'val5', 'key3', ['1', '2', '3']) 

該工作原理是首先引用所有的值,然後刪除所有賦值以允許literal_eval工作。結構被保留。

相關問題