2011-10-04 121 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']