-2

それが私の文字列です:

myclass.test() and(myclass.mytest() and myclass.test("argument")) or (myclass.mytests(1))

関数の一部ではない括弧「(」の開始部分のみをキャプチャしようとしていますが、

そこで、関数のキャプチャを開始しようとしました (そして、このルールを否定しました):

\w*\.\w[^(]*\(

完璧です。関数だけをキャッチします。次の式を使用しようとすると、成功しませんでした (なぜ?)

(?<=(\w*\.\w[^(]*\())\(

注: - myclass. 決して変わらない - "and(" - (?<=t)( < を忘れないでください。

ありがとう :)


一時的な解決策

この場合の「後読み」の研究と適用を続けます。これは興味深いアプローチのようですが、友人 @hwnd は、私の場合に適用される別のアプローチを提案しました。

\((?=myclass)

みんなありがとう。

4

2 に答える 2

0

Python では可変長の後読みを使用できないため、正規表現の外でいくつかの作業を行う必要があります。1 つの可能な方法は、2 つのグループをキャプチャすることです。最初のグループは、class.function存在する場合はその部分をキャプチャし、2 番目のグループは開き括弧をキャプチャします。したがって、最初のグループが一致しない括弧のみを使用できます。

この場合、一致の長さが 1 文字 (つまり、左括弧のみ) であるかどうかを確認してから、一致するインデックスを出力します。一致する文字列を出力することもできます。これは常に開き括弧 =D になります。

import re
text = 'myclass.test() and(myclass.mytest() and myclass.test("argument")) or (myclass.mytests(1))'
for result in re.finditer(r'(\w+\.\w[^(]*\()?\(',text):
    if result.end()-result.start()==1:
        print result.span(), result.string

結果:

(18,19)
(69,70)
于 2013-10-18T16:21:03.110 に答える