-2

那是我的字符串:

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

我试图仅捕获不属于函数的括号“(”的开头,

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

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

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

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

注释: - 我的班级。永远不会改变 - 不要忘记 "and(" - (?<=t)( < 工作正常。

谢谢 :)


临时解决方案

我将继续研究并尝试在这种情况下应用“lookbehind”,这似乎是一种有趣的方法,但我们的朋友@hwnd 提出了一种适用于我的案例的不同方法:

\((?=myclass)

谢谢你们。

4

2 回答 2

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

观看现场演示

您甚至可以在这里使用 Negative Lookbehind。

(?<!\.)\((?!\))
于 2013-10-18T06:32:00.243 回答
0

由于您不能在 Python 中使用可变长度的lookbehind,因此您需要在正则表达式之外做一些工作。一种可能的方法是捕获两个组,第一个将捕获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)
于 2013-10-18T16:21:03.110 回答