【问题标题】:Regular expression to find and replace ")" in anything matching "pc( * )"?在匹配“pc(*)”的任何内容中查找和替换“)”的正则表达式?
【发布时间】:2016-09-19 13:02:22
【问题描述】:

我正在尝试学习正则表达式以加快程序的编辑速度。

我的程序有数百个对 3 维数组 pc 的引用。例如,数组元素可能被称为pc(i+1,j+1,k)pc(i,j+1,k-1)pc(i,j,k)。我需要一个正则表达式来搜索结尾括号,以便可以将其替换为“,1)”。例如,最终目标是将pc(i,j,k) 转换为pc(i,j,k,1)

我不需要正则表达式来进行实际替换——我什至不知道这是否可能——我只需要它来找到结束括号,以便我可以替换它。

任何帮助或提示将不胜感激!

这是我将要搜索的代码的摘录:

PpPx_ey = 0.5*( FNy(i,j+1,k) *((pc(i,j+1,k)-pc(i-1,j+1,k))/xdiff(i,j,k)+(pc(i+1,j+1,k)-pc(i,j+1,k))/xdiff(i+1,j,k) )+(1.-FNy(i,j+1,k))*((pc(i,j, k)-pc(i-1,j, k))/xdiff(i,j,k)+(pc(i+1,j ,k)-pc(i,j ,k))/xdiff(i+1,j,k)) ).

进一步澄清:我使用的是 Atom 记事本,它允许在 CTRL-F 命令中使用正则表达式。我想对我 CTRL-F 的东西使用“替换”选项,但我需要为那部分使用文字字符串。因此,如果我可以使用正则表达式在看起来像 pc( ) 的任何内容中找到结尾“)”,我可以将其替换为“,1)”。

【问题讨论】:

  • pc\(.*?(\)) 怎么样?
  • 正确找到pc() 形式的字符串,但我只需要它返回结束括号,而不是整个字符串。表达式pc\(.*?(\))pc(i,j,k,0) 中找到c(i,j,k,0),但我需要它只返回)

标签: regex multidimensional-array


【解决方案1】:

其实很简单。

这应该为你做:

pc\(.*\)

pc = 字面意思是pc
\( = 转义(
.* = 任何东西
\) = 转义)

【讨论】:

  • 不幸的是,它似乎不起作用,因为我有例如(pc(i,j+1,k)-pc(i-1,j+1,k))/xdiff(i,j,k),它以pc( 开头并以) 结尾。该表达式查找整个字符串,而不仅仅是pc( ) 部分。有什么想法吗?
【解决方案2】:
(pc\(.*?)\)
  • ( - 开始一个捕获组。
  • pc - 这将匹配文字 pc

  • \( - 匹配左括号。反斜杠转义 括号,因此它不会被解释为 a 的开头 捕获组。

  • .*? - 懒惰地匹配任何东西。 . 将匹配任何单个 特点。 * 是匹配任何数字的量词(包括 前一个元素的零),在这种情况下为.? 导致 前面的量词是惰性的,这意味着它将匹配 可能的最小字符数。这就是阻止匹配的原因 字符串中的pc(i,j+1,k)-pc(i-1,j+1,k) (pc(i,j+1,k)-pc(i-1,j+1,k))/xdiff(i,j,k) 作为一场比赛,而不是 两个不同的匹配项。

  • ) - 结束捕获组。

  • \) - 与 \( 相同,但匹配右大括号。

如您所述,右大括号可以替换为,1)。除了右大括号之外的所有内容都被捕获。第一个捕获组通常使用$1\1 在替换字符串中引用。所以像$1,1) 这样的东西应该替换右括号。

【讨论】:

  • 啊!如果我使用实际程序来处理我的字符串,这可能会起作用,但我只是使用我的代码编辑器。它允许在 CTRL-F 框中使用正则表达式,但不允许在替换框中使用正则表达式。因此,我不能使用 ())。有什么方法可以在替换部分不使用正则表达式的情况下完成我的需要? (希望我的困境是有道理的......)
  • @EternusVia 更新了我的答案。如果可以使用正则表达式进行匹配,则应该可以在替换字符串中使用捕获的组。
  • @EternusVia 在 Notepad++ 中,您可以在替换字符串中使用 $1 来使用捕获的组。 $1,1 应该做的工作
  • @EternusVia 确保您使用的是我更新后的答案的正则表达式。我之前发布的一个不适用于您想要做的事情。刚刚在 notepad++ 中使用搜索和替换并启用了正则表达式进行了测试,它似乎可以工作
  • 它现在正在使用您更新的表达式。谢谢!
【解决方案3】:

希望对你有所帮助!

根据您的问题,您似乎想找到所有喜欢, k + or - number)的模式,因此应该找出并替换, k+1), k-1), k)

我写了一个正则表达式,应该可以满足你,但并不完美。

是这样的:

import re

s = 'PpPx_ey = 0.5*( FNy(i,j+1,k) *((pc(i,j+1,k)-pc(i-1,j+1,k))/xdiff(i,j,k)+(pc(i+1,j+1,k)-pc(i,j+1,k))/xdiff(i+1, j,k) )+(1.-FNy(i,j+1,k))*((pc(i,j,  k)-pc(i-1,j,  k))/xdiff(i,j,k)+(pc(i+1,j  ,k)-pc(i,j  ,k))/xdiff(i+1,j,k)) )'

print re.findall(',\s*k\s*[\+\-]*\s*\d*\s*\)', s)

com = re.compile(',\s*k\s*[\+\-]*\s*\d*\s*\)')
for i in com.finditer(s):
    print i.start(), i.group()

str_replaced = re.sub(',\s*k\s*[\+\-]*\s*\d*\s*\)', ', 1)', s)
print str_replaced

关键的正则表达式是,\s*k\s*[\+\-]*\s*\d*\s*\),它并不完美,因为它会匹配这样的字符串:,k+),这种字符串可能不需要找到,甚至可能不存在。

表达式,\s*k\s*[\+\-]*\s*\d*\s*\)表示:它将匹配一个字符串:以,开头,然后可能有也可能没有空格或制表符,然后应该有字母k,然后是否有空格,然后可能有@987654329 @, or - or may not have them, then blank or not, then may have adigit number or not, then blank or not, then the end括号 ).

看看这对你有没有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2016-02-21
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多