如何仅删除字符串中单个单词的括号

时间:2015-07-14 11:32:43

标签: python regex

我们说我有一个这样的字符串:

s = '((Xyz_lk) some stuff (XYZ_l)) (and even more stuff (XyZ))'

我想在单个单词周围删除括号,以便获得:

'(Xyz_lk some stuff XYZ_l) (and even more stuff XyZ)'

我将如何在Python中执行此操作?到目前为止,我只是设法使用

将它们与文本一起删除
re.sub('\(\w+\)', '', s)

给出了

'( some stuff ) (and even more stuff )'

我怎样才能删除括号并将文本保留在其中?

1 个答案:

答案 0 :(得分:5)

您可以使用反向引用(实际上在sub函数中称为组引用号):

>>> s='((Xyz_lk) some stuff (XYZ_l)) (and even more stuff (XyZ))'
>>> 
>>> re.sub(r'\((\w+)\)',r'\1',s)
'(Xyz_lk some stuff XYZ_l) (and even more stuff XyZ)'
>>> 

有关详细信息,请阅读以下有关http://www.regular-expressions.info/backref.html的反向引用的说明:

  

反向引用匹配先前与捕获组匹配的相同文本。假设您要匹配一对打开和关闭HTML标记,以及两者之间的文本。通过将开始标记放入反向引用中,我们可以为结束标记重用标记的名称。方法如下:<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>。此正则表达式只包含一对括号,用于捕获由[A-Z][A-Z0-9]*匹配的字符串。这是开始的HTML标记。 (由于HTML标记不区分大小写,因此此正则表达式需要不区分大小写的匹配。)反向引用\1(反斜杠1)引用第一个捕获组。 \1匹配第一个捕获组匹配的完全相同的文本。它之前的/是一个文字字符。它只是我们试图匹配的结束HTML标记中的正斜杠。