0

我在正则表达式中环顾四周时遇到问题。

这里的问题:我有一个要编辑的大文件,我想通过另一个保留第一个参数但删除第二个参数来更改一个函数。

假设我们有:

func1(paramIWantToKeep, paramIDontWant)

或者

func1(func3(paramIWantToKeep), paramIDontWant)

我想改变:

func2(paramIWantToKeep)在这两种情况下。

所以我尝试使用积极的前瞻

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

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

但它不起作用,看来我的正则表达式,在忽略正面展望(.+)之后寻找(, paramIDontWant\))之后寻找与向前看之前相同的位置(所以左括号)

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

谢谢。

PS:对不起我的问题的英语和/或糟糕的结构。

编辑:我使用崇高文本

4

3 回答 3

1

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

因此,如果要替换123abc456abc,则不能简单地匹配123456并删除它。

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

例如,要替换123abc456abc,您可以替换此正则表达式:

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

用这个字符串:

$1

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


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

鉴于:

func1(foo, bar)

替换这个正则表达式:

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

用这个字符串:

func2($1)

结果是:

func2(foo)
于 2013-05-03T12:53:26.403 回答
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))
于 2013-05-03T11:58:35.810 回答
0

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

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

这些与您给出的两个示例有关。我想您正在编辑的真实世界代码稍微复杂一些,但应用一系列正则表达式的总体思路可能会有所帮助

于 2013-05-03T12:22:34.667 回答