那是我的字符串:
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)
谢谢你们。
答案 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)