将括号替换为“ _”,保留所有内容

时间:2019-11-07 20:26:23

标签: python regex

我有一个Verilog文件,其中一些输入和输出被命名为133GAT(123)。例如

nand2 g679(.a(n752), .b(n750), .O(1355GAT(558) ));

在这里,我仅需将1355GAT(558)替换为1355GAT_588而不是.a(n752)。有多个这样的实例。

我尝试使用python3。

re.sub(r'GAT*\((\w+)\)',r'_\1',"nand2 g679(.a(n752), .b(n750), .O(1355GAT(558) ) ")

它的输出为

'nand2 g679(.a(n752), .b(n750), .O(1355_558 ) '

我希望得到的输出为

'nand2 g679(.a(n752), .b(n750), .O(1355GAT_558 ) '

1 个答案:

答案 0 :(得分:0)

为什么您的代码没有给您预期的结果

您的正则表达式GAT*\((\w+)\)匹配GAGATGATT等,尽管它与字符串中的GAT匹配,但您实际上正在替换替换它,因为您从不捕获它,而再次将其包含在替换中。


正则表达式1

此方法有效,您可以选择检查GAT之前的数字。

See this regex in use here

# regex
(\d+GAT)\((\d+)\)

# replacement
\1_\2

代码1

See code in use here

import re

s = "nand2 g679(.a(n752), .b(n750), .O(1355GAT(558) ));"
r = r'(\d+GAT)\((\d+)\)'
x = re.sub(r,r'\1_\2',s)
print(x)

正则表达式2

这也可以,但是使用一个捕获组而不是两个。

See this regex in use here

# regex
(?<=\dGAT)\((\d+)\)

# replacement
_\1

代码2

See code in use here

import re

s = "nand2 g679(.a(n752), .b(n750), .O(1355GAT(558) ));"
r = r'(?<=\dGAT)\((\d+)\)'
x = re.sub(r,r'_\1',s)
print(x)