正则表达式,在环顾之后继续匹配

时间:2013-05-03 11:33:30

标签: regex lookaround

我在正则表达式方面遇到问题。

问题在于:我想要编辑一个大文件,我希望通过另一个保留第一个参数但删除第二个参数来更改一个函数。

我们说:

func1(paramIWantToKeep, paramIDontWant)

func1(func3(paramIWantToKeep), paramIDontWant)

我想改变:

func2(paramIWantToKeep)两种情况。

所以我尝试使用正向前瞻

func1\((?=.+), paramIDontWant\)

现在,我只是尝试不选择第一个参数(然后我会设法用括号做同样的事情)。

但它不起作用,看起来我的正则表达式在忽略前面的正面看(。+)后,在前瞻之前的同一位置寻找(, paramIDontWant\))(所以左括号)< / p>

所以我的问题是,如何在匹配组之后继续正则表达式,此后(。+)。

感谢。

PS:对不起我的问题的英文和/或错误构造。

编辑:我使用Sublime Text

3 个答案:

答案 0 :(得分:1)

import re
t = "func1(paramKeep,paramLose)"
t1 = "func1(paramKeep,((paramLose(dog,cat))))"
t2 = "func1(func3(paramKeep),paramDont)"
t3 = "func1(func3(paramKeep),paramDont,((i)),don't,want,these)"

reg = r'(\w+\(.*?(?=,))(,.*)(\))'

keep,lose,end = re.match(reg,t).groups()
print(keep+end)

keep,lose,end = re.match(reg,t1).groups()
print(keep+end)

keep,lose,end = re.match(reg,t2).groups()
print(keep+end)

keep,lose,end = re.match(reg,t3).groups()
print(keep+end)

可生产

>>> 
func1(paramKeep)
func1(paramKeep)
func1(func3(paramKeep))
func1(func3(paramKeep))

答案 1 :(得分:1)

您需要了解的第一件事是正则表达式将始终匹配连续的字符串。永远不会有差距。

因此,如果您想将123abc456替换为abc,则无法简单地匹配123456并将其删除。

相反,您可以使用capturing group。这将允许您记住正则表达式的一部分以供日后使用。

例如,要将123abc456替换为abc,您可以替换此正则表达式:

\d+([a-z]+)\d+

使用此字符串:

$1

这样做实际上是将匹配替换为第一个捕获组的内容。在这种情况下,捕获组为([a-z]+),与abc匹配。因此,整个匹配仅替换为abc


您可能会发现更有用的示例:

假设:

func1(foo, bar)

替换此正则表达式:

\w+\((\w+),\s*\w+\)

使用此字符串:

func2($1)

结果:

func2(foo)

答案 2 :(得分:0)

按此顺序应用这两个正则表达式

s/(func1)([^,]*)(, )?(paramIDontWant)(.)/func2$2$5/;
s/(func2\()(func3\()(paramIWantToKeep).*/$1$3)/;

这些可以解决你给出的两个例子。我猜你正在编辑的真实世界代码稍微复杂一些,但应用一系列正则表达式的一般想法可能会有所帮助