2011-10-04 122 views
0

我有一個正則表達式的另外一個問題,我要趕INFO1,INFO2和INFO3:蟒蛇正則表達式搜索

>>> a 
'|123|blabla bloblo|90' 
>>> b 
'|123|blabla[[blibli|bloblo]]|90' 
>>> re.search('\|(?P<info1>\d+)\|(?P<info2>[^\|]*)\|(?P<info3>\d+)',a).groupdict() 
{'info1': '123', 'info3': '90', 'info2': 'blabla bloblo'} 
>>> re.search('\|(?P<info1>\d+)\|(?P<info2>[^\|]*)\|(?P<info3>\d+)',b).groupdict() 
AttributeError: 'NoneType' object has no attribute 'groupdict' 

我想用|作爲分隔符,但如果它環繞在[[]]或{{}} 對於B我想:

{'info1': '123', 'info3': '90', 'info2': 'blabla[[blibli|bloblo]]'} 

感謝,

+7

請勿爲此使用單個正則表達式。即使可能,它也是難以辨認的。先使用正則表達式分割出包圍的部分。如果語法變得比這更復雜,你應該開始考慮一個詞法分析器。 – user37078

+0

你有任何控制這種格式?因爲如果你可以用單個字符來引用例如而不是[[和]]使用'''或其他字符,您可以使用csv模塊輕鬆解析它 –

回答

0

只給你另類和假設你的數據不包含引號"或者你可以與任何其他字符替換它,這裏是客場使用CSV模塊

import csv 
import StringIO 
data = '|123|blabla|[[blibli|bloblo]]|90' 
# assuming data doesn't have quotes, we can convert [[ and ]] to quotes and use csv to parse it 
data = data.replace('[[','"').replace(']]','"') 
print data 
for row in csv.reader(StringIO.StringIO(data), delimiter='|', quotechar='"'): 
    print row 

輸出:

|123|blabla|"blibli|bloblo"|90 
['', '123', 'blabla', 'blibli|bloblo', '90']