5

我想请你帮忙。

我有一大段数据,如下所示:

     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的行一个字。我无法创建正确的正则表达式来以这种形式捕获它:

{
  "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)

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

提前致谢!

PS 文件的规范形式如下所示:

a
  b : c 901
  d : e sda

每个部分都以一个单词开头,然后是属性行(在两个空格之后),属性之间用 (" : ") 分隔,然后是属性行或单个单词的行。禁止使用其他空格。可能会更容易。

4

3 回答 3

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 )

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

于 2013-02-14T10:25:55.940 回答
0

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

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

您需要将以上内容与or选项相匹配regexsinglelinedotall

Group1 和 Group2 每次匹配时匹配您想要的

这里查看..use dot all 选项

于 2013-02-14T10:34:30.597 回答
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']]}
于 2013-02-14T10:54:59.253 回答