【问题标题】:Regex, continue matching after lookaround正则表达式,环顾后继续匹配
【发布时间】:2013-04-27 19:14:05
【问题描述】:

我在使用正则表达式时遇到问题。

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

假设我们有:

func1(paramIWantToKeep, paramIDontWant)

func1(func3(paramIWantToKeep), paramIDontWant)

我想改变:

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

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

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

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

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

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

谢谢。

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

编辑:我使用 Sublime Text

【问题讨论】:

  • 了解您希望使用哪种语言或编辑器可能会有所帮助,因为可以给出更易于理解的答案。这似乎是一项重构工作,但许多体面的编辑可以为您完成。
  • 是的,我使用 Sublime Text,是的,我找到了重构的解决方法,但我仍然想知道如何在环顾四周后继续使用正则表达式,跳过我忽略的组。
  • 这就是环视的工作方式,它们确保在某个位置出现条件。您不能“忽略”模式中的某些内容,无论您的模式是否匹配。您可以匹配某个模式,如果您对某个部分感兴趣,可以使用捕获组提取该部分。
  • “func1”和“func3”是否已知?即他们正是这些名字吗?
  • 所以我无法在正则表达式中得到类似的东西:3232stringIDontWant32344 只保留数字?

标签: regex lookaround


【解决方案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】:
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))

【讨论】:

  • 谢谢,我确实设法在我的文本编辑器中使用组替换来做到这一点。
【解决方案3】:

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

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

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

【讨论】:

  • 谢谢,我最初想在一个正则表达式中执行此操作,但似乎无法实现环顾四周的概念,然后我将使用分组或多个正则表达式.
猜你喜欢
  • 1970-01-01
  • 2015-11-21
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多