3

だから私は理解できない簡単な質問があります。

たとえば、解析したい行がいくつかあります。

  • a = a/2;
  • b*= a/4*2;
  • float c += 4*2*sin(2);

そして、私が望むのは、割り当ての割り当てられた変数名を取得することです。aしたがって、この場合、 、b、を取得したいと思いますc

次の正規表現があります。

match = re.search(r'\b(?:float)?(.*)(?:(\+|-|\*|\\)? =)',line)

印刷すると、、、m.group(1)が返さaれます。b *c +

前にオペレーターもキャプチャする理由がわかり=ません。誰か説明してもらえますか?

4

2 に答える 2

2

で先行する欲張りキャプチャが(.*)あり、演算子キャプチャをオプションにすることができます(末尾は?)。これにより、貪欲なキャプチャは、に一致するグループにフォールスルーさせるのではなく、オペレータを取り込むものになり=ます。

貪欲なキャプチャを、そこで許容できるものだけに変更してみてください。見た目からは、英数字の値とスペースのみである可能性があります(数字は推測であるため、必要がない場合は削除できます)。

\b(?:float\s+)?([a-zA-Z0-9]+)\s*(?:(\+|-|\*|\\)? =)
于 2012-10-02T15:17:18.327 に答える
0

もっと単純な正規表現にできると思います。

まず第一に、変数は英数字しか使用できません。他のそのような変数はまだ見ていません。

したがって、すでにキャプチャ グループは次のようになっています。(\w+)

次に、その前にできる唯一のものがフロートである場合、実際にはそのように見えるはずです\b(?:float\s+)?

しかし、本当に必要なのはそれだけです。

欠けている唯一のことは、一度にすべてを読み取ろうとする場合に行の最後まで読み取ることです。それ以外の場合は、各行が来るたびに読み取る場合は必要ありません。.*\n

\b(?:float\s+)?(\w+).*\n つまり、正規表現がスペース、「=」記号などの英数字以外に達すると、キャプチャ グループの一部ではなくなります。

:)

あなたの例で言及した正規表現を実行します:

>>> import re
>>> re.findall(r'\b(?:float\s+)?(\w+).*\n', "a = a/2;\nb*= a/4*2;\nfloat c += 4*2*sin(2);\n")
['a', 'b', 'c']

一度に各行を実行します: (^正規表現に文字列の先頭から開始するように指示します。)

>>> re.findall(r'^(?:float\s+)?(\w+)', "a = a/2")
['a']
>>> re.findall(r'^(?:float\s+)?(\w+)', "b*= a/4*2")
['b']
>>> re.findall(r'^(?:float\s+)?(\w+)', "float c += 4*2*sin(2)")
['c']
于 2012-10-02T15:44:48.010 に答える