1. ホーム
  2. python

[解決済み] 正規表現 グループの複数のマッチにアクセスするには?重複

2023-03-30 06:43:50

質問

私はかなり複雑な正規表現をまとめています。式の一部は、'+a'、'-57' などの文字列にマッチします。a + または a - の後に任意の数の文字または数字が続きます。このパターンに一致する0個以上の文字列にマッチさせたいと考えています。

これが私が思いついた式です。

([\+-][a-zA-Z0-9]+)*

このパターンで文字列 '-56+a' を検索すると、2つのマッチが得られると予想されます。

+a と -56

しかし、最後のマッチしか返ってきません。

>>> m = re.match("([\+-][a-zA-Z0-9]+)*", '-56+a')
>>> m.groups()
('+a',)

pythonのドキュメントを見ると、そうなっていますね。

グループが複数回マッチした場合、最後にマッチしたものだけがアクセス可能です。

>>> m = re.match(r"(..)+", "a1b2c3")  # Matches 3 times.
>>> m.group(1)                        # Returns only the last match.
'c3'

そこで質問ですが、どのように を行うかです。 にアクセスできるのでしょうか?

どのように解決するのですか?

を削除します。 * を削除します (つまり、パターンのちょうど一つのインスタンスにマッチします)。次に re.findall(...) または re.finditer (参照 はこちら を参照)で、全てのマッチを返します。

更新しました。

基本的に、あなたは 再帰的降下パーサ . 比較的単純な解析タスクであれば、手作業で行うのが一般的であり、非常に合理的です。ライブラリのソリューションに興味がある場合(たとえば、解析タスクが後でもっと複雑になる可能性がある場合など)、以下を参照してください。 pyparsing .