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": [["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

すべてのセクションは 1 つの単語で始まり、次に属性行 (2 つの空白の後) に続き、属性は (" : ") で区切られ、次に agane 属性行または単一の単語を含む行になります。その他の空白は禁止されています。おそらくそれはより簡単になるでしょう。

4

3 に答える 3

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 に答える