1

たとえば、IANA の次の形式を取ります: http://www.iana.org/assignments/language-subtag-registry

%%
Type: language
Subtag: aa
Description: Afar
Added: 2005-10-16
%%
Type: language
Subtag: ab
Description: Abkhazian
Added: 2005-10-16
Suppress-Script: Cyrl
%%
Type: language
Subtag: ae
Description: Avestan
Added: 2005-10-16
%%

ファイルを開くとします。

import urllib
f = urllib.urlopen("http://www.iana.org/assignments/language-subtag-registry")
all=f.read()

通常、あなたはこのようにします

lan=all.split("%%") 

lan をsplit("\n")反復し、結果を反復して分割します(":")。反復なしで 1 つのバッチで Python でこれを行う方法はありますか?出力は次のようになります: [[["Type","language"],["Subtag", "ae"],...]...]?

4

4 に答える 4

3

各分割後に到達する要素が意味的に異なる場合、単一のパスでこれを実行しようとしても意味がありません。

「:」で分割することから始めることもできます。これにより、きめ細かいデータが得られますが、このデータが何に属しているのかわからない場合、それは何の役にも立ちません。

とはいえ、すべてのレベルの分離をジェネレーター内に配置して、データを使用して辞書オブジェクトを生成し、すぐに使用できるようにすることができます。

def iana_parse(data):
    for record in data.split("%%\n"):
        # skip empty records at file endings:
        if not record.strip():
            continue
        rec_data = {}
        for line in record.split("\n"):
            key, value = line.split(":")
            rec_data[key.strip()] = value.strip()
        yield rec_data

コメントでリクエストしたとおりに 1 つのライナーとして実行できますが、コメントで返信したように、1 行に 1 つの式として収まるように記述できます。上記の例よりも書くのに時間がかかり、維持するのはほぼ不可能です。上記の例のコードは、"邪魔にならない" 場所に配置された数行のコードでロジックを展開します。つまり、実際のデータを扱うインラインではなく、両方のタスクの読みやすさと保守性を提供します。

そうは言っても、必要に応じてネストされたリストの構造として解析するには、次のようにします。

structure = [[[token.strip() for token in line.split(":")] for line in record.split("\n") ] for record in data.split("%%") if record.strip() ]
于 2012-09-17T13:50:36.143 に答える
2

正規表現ですが、要点がわかりません。

re.split('%%|:|\\n', string)

|ここでは、or演算子を使用して複数のパターンが連鎖されています。

于 2012-09-17T13:55:15.957 に答える
2

使用できますitertools.groupby

ss = """%%
Type: language
Subtag: aa
Description: Afar
Added: 2005-10-16
%%
Type: language
Subtag: ab
Description: Abkhazian
Added: 2005-10-16
Suppress-Script: Cyrl
%%
Type: language
Subtag: ae
Description: Avestan
Added: 2005-10-16
"""
sss = ss.splitlines(True) #List which looks like you're iterating over a file object


import itertools

output = []
for k,v in itertools.groupby(sss,lambda x: x.strip() == '%%'):
    if(k):  #Hit a '%%' record.  Need a new group.
        print "\nNew group:\n"
        current = {}
        output.append(current)
    else:   #just a regular record, write the data to our current record dict.
        for line in v:
            print line.strip()
            key,value = line.split(None,1)
            current[key] = value

この回答の利点の 1 つは、ファイル全体を読む必要がないことです。式全体が遅延評価されます。

于 2012-09-17T13:59:48.110 に答える