0

\n\nPythonで文字列を分割する最も簡単な方法は何ですか?

これは、http://ftp2.de.debian.org/debian/dists/stable/main/binary-i386/Packages.gz の zcat 出力から得られる生の文字列です

Package: zziplib-bin\n
Priority: optional\n
Section: utils\n
Installed-Size: 116\n
Maintainer: LIU Qi <liuqi82@gmail.com>\n
Architecture: i386\n
Source: zziplib (0.13.56-1)\n
Version: 0.13.56-1+b1\n
...\n
\n
Package: zzuf\n
Priority: optional\n
Section: devel\n
Installed-Size: 228\n
Maintainer: Sam Hocevar <sho@debian.org>\n
Architecture: i386\n
Version: 0.13.svn20100215-2\n
...\n
\n

おそらく、あなたの誰もがこれをやったことがあります

これは理想的には次のようになります。

{
"zziplib-bin": {"Version": "0.13.56-1+b1"},
"zzuf": {"Version": "0.13.svn20100215-2"},
...
}

- ティモ

4

3 に答える 3

2

Pythonで\n\nで文字列を分割する最も簡単な方法は何ですか?

使用する.split

>>> "a\n\nb\n\n\nc".split("\n\n")
['a', 'b', '\nc']
于 2012-10-19T11:45:59.053 に答える
1

以下のスクリプトは、Packages.gz ファイルを直接読み取り、python の gzip モジュールを使用して解凍するため、zcat を使用する余分な手順を省くことができます。次に、分割した後'\n\n'、各パッケージの詳細を調べ、正規表現を使用してパッケージ名とバージョンを抽出します。パッケージとそのバージョン情報を格納するデータ構造の 2 つの実装を提供しました。2番目のものは質問で言及された構造に従います。最初のものは、各パッケージ名をそのバージョンにマップするだけのよりフラットなものです。

import gzip, re
packages = gzip.open('Packages.gz', 'rb').read()
p = packages.strip().split('\n\n')
pack = re.compile('^Package: (.*)')
ver = re.compile('\nVersion: (.*)')

info = dict([(pack.findall(i)[0], ver.findall(i)[0]) for i in p])
print info['whois']

info = dict([(pack.findall(i)[0], {'Version': ver.findall(i)[0]}) for i in p])
print info['whois']

出力

5.0.10
{'Version': '5.0.10'}
于 2012-10-19T21:22:37.600 に答える
0

私はそれを考え出した。たぶん、誰かがそれについてより良い提案をすることができます。

a = zcat_output.split('\n\n')
a.pop(len(a)-1)
c = dict()
for x in [x.splitlines() for x in a]:
    pkg = ""
    for y in [y for y in x if y.startswith('Package:') or y.startswith('Version:')]:
        z = y.split(':')
        if z[0] == 'Package':
            pkg = z[1].strip()
        else:
            c[pkg] = {z[0]: z[1].strip()}

print c.get('whois')

出力:

{'Version': '5.0.10'}
于 2012-10-19T12:13:42.727 に答える