3

プログラムが別の日に実行されると、新しいログを追加するログファイルがあります。反復ごとに、新しい製品バージョンと起動スイッチがあります。タプルとして各反復からのProduct Version: [0-9-]*とが必要です。Launch Switch: \w*

現在私はこれを行っています:

ver = re.findall(r'(?<=Product Version: )[0-9.]*', s)

launch = re.findall(r'(?<=Launch Switch: )\w*', s)

その後、繰り返してタプルを作成しますverlaunchそれは機能しますが、きれいではなく、これを行うためのよりPythonicな方法があると確信しています。

4

3 に答える 3

3

正規表現パターン内で複数のキャプチャグループを使用できます。re.findallその後、それらをタプルとして返します。例えば:

>>> data = "Product Version: 0.0.1 | Launch Switch: hello | Product Version: 2.3.4 | Launch Switch: world"
>>> re.findall("Product Version: ([0-9.]+).*?Launch Switch: (\w+)", data)
[('0.0.1', 'hello'), ('2.3.4', 'world')]

ドキュメントから:_re.findall

文字列のリストとして、文字列内のパターンの重複しない一致をすべて返します。文字列は左から右にスキャンされ、一致するものが見つかった順序で返されます。パターンに1つ以上のグループが存在する場合は、グループのリストを返します。パターンに複数のグループがある場合、これはタプルのリストになります。空の試合は、別の試合の開始に触れない限り、結果に含まれます。

于 2013-02-07T17:32:47.880 に答える
2

あなたが使用することができますzip

ver_launch_tuples = zip(re.findall(r'(?<=Product Version: )[0-9.]*', s),
                        re.findall(r'(?<=Launch Switch: )\w*', s))

これにより、(ver、launch)タプルのリストが作成されます。

于 2013-02-07T17:24:15.597 に答える
0

これがどれほど「pythonic」であるかはわかりませんが、次のいずれかの順序でこれらの項目を含む文字列からタプルを取得します。

import re
str = """Product Version: 23423
Launch Switch: foiwjefj"""
tuple([word for sublist in [[x for x in f if x != ''] for f in re.findall(
    r'Product Version: (\d+)|Launch Switch: (\w+)', str)] for word in sublist])

もちろん、これにはいくつかの仮定があります。

  1. Product VersionそしてLaunch Swtich常にその順序で来る
  2. 空ではない
  3. 文字列ごとに1つだけあります。
于 2013-02-07T17:58:11.760 に答える