3

PythonのRegExを使用して、要素数が不明な文字列を解析しようとしています。次に例を示します。

>>>> import re
>>>> re.match("\=( A([0-9]+))*", "= A1 A2 A3 A4").groups()[1::2]
('4',)

私は持っていることを期待しています:

('1', '2', '3', '4',)

どうすれば期待どおりの結果を得ることができますか?

編集:

re.findall私のために動作しません。より良い例を挙げましょう:

次の文字列と一致させたい:

_func(cmd, param1, param2, param3, param4)_

パラメータの数は事前にはわかりません。私は次のコードを使用してそれを解決することを期待していました:

>>> re.match("(\w+)\(cmd(, (\w+))*\)", "func(cmd, param1, param2, param3, param4)")

ただし、グループ()*は多くのアイテムに展開されず、最後のアイテムのみが使用されるため、これは機能しません。何か案は?

4

1 に答える 1

3
pat = re.compile(r' A(\d+)')
lst = re.findall(pat, "= A1 A2 A3 A4")

これはリストを返し、あなたの例ではタプルを示しました。リストがうまくいくと思いますが、もちろんいつでもできます:

t = tuple(lst)

=私が与えた答えは、実際には入力文字列の をチェックしません。その必要がある場合は、いつでも 2 つのパターンと 2 つの手順を使用できます。

pat0 = re.compile(r'=(?: A\d+)+')
pat1 = re.compile(r' A(\d+)')

m = pat0.search("= A1 A2 A3 A4")
if not m:
    print("input string not what was expected")
else:
    s = m.group(0)
    lst = re.findall(pat, s)

func()編集:あなたの例を処理するコード:

s_code = "func(cmd, param1, param2, param3, param4)"
pat_recognize_args = re.compile(r'func\(cmd([^)]*)\)')
pat_parse_args = re.compile(r'[, ]+([^, ]+)')

m = pat_recognize_args.search(s_code)
if m:
    s = m.group(1)
    lst = re.findall(pat_parse_args, s)

上記のコードを実行すると、次のようlstに設定されました。['param1', 'param2', 'param3', 'param4']

pat_recognize_argsfuncリテラルを含むリテラル文字列((パターンではバックスラッシュでエスケープされているためre、一致グループの開始に使用しようとしません)、リテラル文字列、リテラル文字cmdまでのすべてに一致する一致グループを探します。 ); 次に、一致グループは a で閉じられ、関数呼び出しを終了する実際のものと一致)するリテラルがあります。このパターンが一致すると、一致オブジェクトのグループ 1 が関数呼び出しからの興味深い引数だけに設定されます。))

s = m.group(1)次に、引数を設定しre.findall()てから、引数を取り出します。

于 2012-06-04T23:06:38.247 に答える