7

私はpython正規表現モジュールを使用していますre.

この 2 つのフレーズの '(' ')' 内のすべてを一致させる必要がありますが、「それほど貪欲ではありません」。このような:

show the (name) of the (person)

calc the sqrt of (+ (* (2 4) 3))

結果は、フレーズ 1 から返されます。

name
person

フレーズ 2 から結果が返されます。

+ (* (2 4) 3)

問題は、最初のフレーズに合わせるために、私が使用したことです'\(.*?\)'

これは、2番目のフレーズで、ぴったりです+ (* (2 4)

そして'\(.*\)'、2番目のフレーズを正しく適合させるために使用すると、最初のフレーズが適合します(name) of the (person)

両方のフレーズで正しく機能する正規表現は何ですか?

4

4 に答える 4

7

Pyparseを使用すると、次のような単純な 1 回限りのパーサーを簡単に作成できます。

>>> text = """show the (name) of the (person)
...
... calc the sqrt of (+ (* (2 4) 3))"""
>>> import pyparsing
>>> for match in pyparsing.nestedExpr('(',')').searchString(text):
...   print match[0]
...
['name']
['person']
['+', ['*', ['2', '4'], '3']]

ネストされた括弧が破棄され、ネストされたテキストがネストされた構造として返されることに注意してください。

各括弧ビットの元のテキストが必要な場合は、originalTextFor 修飾子を使用します。

>>> for match in pyparsing.originalTextFor(pyparsing.nestedExpr('(',')')).searchString(text):
...   print match[0]
...
(name)
(person)
(+ (* (2 4) 3))
于 2011-05-20T12:58:42.217 に答える
0

あなたがやろうとしていることは、操車場のように見えます(実際には、LISPのように見えるので、PyLispをチェックする必要があります)。これらの種類の式を解析するために正規表現を使用する必要はありません。

操車場の記事@ウィキペディアを参照してください。これはPythonの実装です。

于 2011-05-20T12:38:57.650 に答える
0

これは、必要なすべての情報に一致します。

(?:\()(.*?\){2})|(?:\()(.*?)(?:\))

グループ 1 = + (* (2 4) 3)

  • 最後の ")" は .strip(')') で取り除くことができます

グループ 2 =名前人物

于 2011-05-20T14:50:25.177 に答える
-3

ブラケットがネストされていない限り、遅延正規表現を使用できます。

\(.*?\)

理論的には、正規表現の限られた量のネストを解析できますが、それは非常に困難であり、努力する価値はありません。カスタム python 関数を使用する方がはるかに簡単です。良い説明については、この回答を参照してください。

于 2011-05-20T12:26:15.530 に答える