在这种情况下如何使用LookBehind?我迷路了

时间:2013-10-18 05:50:30

标签: regex

那是我的字符串:

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

我试图仅捕捉括号的开头"("不属于函数的一部分,

所以我尝试开始捕获函数(然后拒绝这个规则):

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

完美,我只捕捉函数,当我尝试使用下面的表达式时,我没有成功(为什么?)

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

注意: - 我的课。从不改变 - 别忘了&#34;和(&#34; - (?&lt; = t)(&lt;工作正常。

谢谢:)


临时解决方案

我将继续学习并尝试应用&#34; lookbehind&#34;对于这种情况,这似乎是一个有趣的方法,但我们的朋友@hwnd提出了一种适用于我的情况的不同方法:

\((?=myclass)

谢谢你们。

2 个答案:

答案 0 :(得分:1)

我对函数的一部分有点困惑,或者不在这里。

要匹配您可以执行的以下myclass.test(部分。

[a-zA-Z]+\.[a-zA-Z]+\(

这两个都将匹配不属于myclass.函数的空括号。

积极前瞻

\((?=[^)])

正则表达式:

\(          '('
(?=         look ahead to see if there is:
 [^)]       any character except: ')'
)           end of look-ahead

否定前瞻

\((?!\))

正则表达式:

\(          '('
 (?!        look ahead to see if there is not:
  \)        ')'
 )          end of look-ahead

请参阅live demo

你甚至可以在这里使用负面观察。

(?<!\.)\((?!\))

答案 1 :(得分:0)

由于你不能在Python中使用可变长度的lookbehind,你需要在regex之外做一些工作。一种可能的方法是捕获两个组,第一个捕获class.function部分(如果存在),第二个捕获开括号。所以你可以采取第一组没有匹配的括号。

在这种情况下,我们检查匹配长度是否是一个字符(即只有左括号),然后我们打印匹配的索引。您也可以打印匹配的字符串,它始终是一个左括号= 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)