2013-02-14 14 views
5

我想问你的帮助。Python:正则表达式来捕获数据

我有一个大的数据块,它看起来像这样:

 a 
    b : c 901 
    d : e sda 
v 
    w : x ads 
    any 
    abc : def 12132 
    ghi : jkl dasf 
    mno : pqr fas 
    stu : vwx utu 

描述:文件始于含有字线(它可以与空白开始和空格可以字之后是还),然后遵循冒号分隔的属性行(也可以有空格),然后再一行属性或行与一个单词。我无法创建正确的正则表达式来抓住它以这样的形式:

{ 
    "a": [["b": "c 901"], ["d", "e sda"]], 
    "v": [["w", "x ads"]], 
    "any": ["abc", "def 12132"], ["ghi", "jkl dasf"], 
    # etc. 
} 

这里是我试过:

regex = str() 
regex += "^(?:(?:\\s*)(.*?)(?:\\s*))$", 
regex += "(?:(?:^(?:\\s*)(.*?)(?:\\s*):(?:\\s*)(.*?)(?:\\s*))$)*$" 
pattern = re.compile(regex, re.S | re.M) 

但是,它没有找到我需要什么。你可以帮帮我吗?我知道我可以在没有正则表达式的情况下处理文件,使用逐行迭代器和检查“:”符号,但是文件太大而无法用这种方式处理它(如果你知道如何快速处理它,而不使用正则表达式,这也将是正确的答案,但首先想到的是太慢)。

在此先感谢!

P.S.在文件的规范形式是这样的:

a 
    b : c 901 
    d : e sda 

逢节有一个字开始,然后按照属性线(双空格之后),有属性分开用(“:”),然后agane属性线或用一个单词排成一行。其他空格是禁止的。可能会更容易。

+0

+1超清晰;整齐地陷害问题。 – Yavar 2013-02-14 10:37:16

回答

3

正则表达式在这里真的需要吗?试试这个伪代码:

result = {} 

last = None 
for _line in data: 
    line = _line.strip().split(":") 
    if len(line) == 1: 
     last = line[ 0 ] 
     if last not in result: 
      result[ last ] = [] 
    elif len(line) == 2: 
     obj = [ line[ 0 ].strip(), line[ 1 ].strip() ] 
     result[ last ].append(obj) 

我希望我能正确理解你的数据结构。

+2

这是正确的方法,不需要正则表达式,我在这里删除了一个答案,因为这不是没有必要的,这是您需要的解决方案。 (可能需要稍微调整一下 - 但它是你想要的)+1 – 2013-02-14 10:54:38

0

你可以使用这个表达式..

(?:[\n\r]+|^)\s*(\w+)\s*[\n\r]+(\s*\w+\s*:\s*.*?)(?=[\n\r]+\s*\w+\s*[\n\r]+|$) 

您需要比赛上述regexsinglelinedotall选项

1与组2相匹配你想要的每一次你匹配

检出here ..使用点全部选项

0
# a more golf - like solution 
from itertools import groupby 

groups = groupby(map(lambda s: map(str.strip,s.split(':')), data), len) 
dict((next(i[1])[0], list(next(groups)[1])) for i in groups) 

出来:

{'a': [['b', 'c 901'], ['d', 'e sda']], 
'any': [['abc', 'def 12132'], 
    ['ghi', 'jkl dasf'], 
    ['mno', 'pqr fas'], 
    ['stu', 'vwx utu']], 
'v': [['w', 'x ads']]}