我正在尝试学习正则表达式以加快编辑程序。
我的程序有数百个对三维数组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
)"。
答案 0 :(得分:0)
实际上很简单。
这应该适合你:
pc\(.*\)
pc
=字面意思pc
\(
=已转义(
.*
=任何事物
\)
=已转义)
答案 1 :(得分:0)
(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)
之类的东西应该取代右括号。
答案 2 :(得分:0)
希望这会对你有所帮助!
根据您的问题,您似乎想要找到所有类似, 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
,然后是否为空白,然后可能有+
,或-
或根本没有它们,然后空白或不空白,然后可能有一个数字或不,然后空白或不空白,然后结束括号{{1 }}
检查这是否对您有帮助。