2017-08-14 103 views
0

我的字符串中将包含()。我需要做的是改变括号内的文字。替换Python中的()之间的文本

示例字符串:"B.TECH(CS,IT)"。 在我的字符串,我需要出现在括号内的内容更改为这样的事情.. B.TECH(ECE,EEE)

我试图解决这个问题如下..

reg = r'(()([\s\S]*?)())' 
a = 'B.TECH(CS,IT)' 
re.sub(reg,"(ECE,EEE)",a) 

但我得到的输出喜欢这个..

'(ECE,EEE)B(ECE,EEE).(ECE,EEE)T(ECE,EEE)E(ECE,EEE)C(ECE,EEE)H(ECE,EEE)((ECE,EEE)C(ECE,EEE)S(ECE,EEE),(ECE,EEE)I(ECE,EEE)T(ECE,EEE))(ECE,EEE)' 

有效输出应该是这样..

B.TECH(CS,IT) 

我在哪里丢失以及如何正确替换文本。

+3

尝试转义()你想要他们作为文字标记。例如:'\(([\ s \ S] *)\)'。 '('和')'是分组字符,所以你需要明确地说它们的意思是字面标记而不是正则表达式操作符。 – rubenwardy

+2

您是否尝试过regex101.com或其他人?它会显示你的执行结果,并“解释”你的正则魔法。你应该逃避你的()字符,所以它会从组中告诉它 – sudo97

回答

3

问题是您使用的括号在RegEx中有其他含义。它们被用作分组字符来捕捉输出。

您需要将()想要的位置转义为文字标记。您可以使用反斜杠字符转义字符:\(

下面是一个例子:

reg = r'\([\s\S]*\)' 
a = 'B.TECH(CS,IT)' 
re.sub(reg, '(ECE,EEE)', a) 
# == 'B.TECH(ECE,EEE)' 
3

您正则表达式不工作的原因是因为你试图匹配括号,这是在考虑正则表达式元字符。 ()实际上捕获一个空字符串,并将尝试替换它。这就是为什么你得到你看到的输出。

要解决这个问题,你需要逃生者括号 - 沿

\(...\) 

线的东西为您的特定用途的情况下,我可能会建议一个简单的模式?

In [268]: re.sub(r'\(.*?\)', '(ECE,EEE)', 'B.TECH(CS,IT)') 
Out[268]: 'B.TECH(ECE,EEE)'