0

だから私は生の文字列をリストに解析しようとしています(実際には多く)ので、私が持っているとしましょう:

|[nothing detected] www.neopets.com/
        |status: (referer=http://www.google.com)saved 55189 bytes /fetch_d4cd213a56276ca726ddd437a1e75f1024ab7799
        |file: fetch_d4cd213a56276ca726ddd437a1e75f1024ab7799: 55189 bytes
        |file: decoding_367af53b4963986ecdeb9c09ce1a405b5b1ecd91: 68 bytes
        |[nothing detected] (script) images.neopets.com/js/common.js?v=6
            |status: (referer=http://www.google.com)saved 1523 bytes /fetch_8eeadcc08d4cb48c02dedf18648510b75190d1d7failure: [Errno 13] Permission denied: '/tmp/tmpsha1_8d7fb3ff1ef087c7ea2bf044dee294735a76ed4b.js'
            |file: fetch_8eeadcc08d4cb48c02dedf18648510b75190d1d7: 1523 bytes

そして、それは同様のパターンに従います。タブの深さが最大で3であると仮定しましょう。これを各サブリストに解析する方法を見つけようとしているので、この特定のケースでは、最初の「何も検出されない」を含むリストの後にステータスを含むリストが続きます。ファイル、ファイル、およびステータス/ファイルの結果に沿って検出された次の何も含まないリスト。(私の言い回しが最高ではないことを知っています、ごめんなさい)。ありがとう!

これまで、各行の「\ t」を数えて全体を繰り返してみましたが、繰り返しに戻れないため、かなり混乱しています。

4

1 に答える 1

1

それぞれの方法でトラバースできるデータ構造、つまり、それを含むリストを認識しているリストが必要だと思います。これが私の試みです。

s = """|[nothing detected] www.neopets.com/
\t|status: (referer=http://www.google.com)saved 55189 bytes /fetch_d4cd213a56276ca726ddd437a1e75f1024ab7799
\t\t|file: fetch_d4cd213a56276ca726ddd437a1e75f1024ab7799: 55189 bytes
\t\t|file: decoding_367af53b4963986ecdeb9c09ce1a405b5b1ecd91: 68 bytes
\t\t|[nothing detected] (script) images.neopets.com/js/common.js?v=6
\t\t\t|status: (referer=http://www.google.com)saved 1523 bytes /fetch_8eeadcc08d4cb48c02dedf18648510b75190d1d7failure: [Errno 13] Permission denied: '/tmp/tmpsha1_8d7fb3ff1ef087c7ea2bf044dee294735a76ed4b.js'
\t\t|file: fetch_8eeadcc08d4cb48c02dedf18648510b75190d1d7: 1523 bytes""".splitlines()

class MyList(list):
    def __init__(self, parent):
        self.parent = parent
        list.__init__(self)

top = current = MyList(None)
ntab_old = 0
for line in s:
    ntab = line.count('\t') #may need to be more robust to get tabs only at beginning
    if(ntab_old > ntab):
        #go up ntab_old - ntab levels.
        for _ in range(ntab_old - ntab):
            current = current.parent
    elif(ntab_old < ntab):
        #increased indentation means we want a new list
        current.append(MyList(current))
        current = current[-1]
    current.append(line)
    ntab_old = ntab

print top
于 2012-10-22T13:11:39.817 に答える