替换所有括号内的特定元素

min*_*ion 0 python regex

所有特定字母,比如'A',都需要在所有括号中替换.

例如,

A. (AbbAAbb) .A. (bbAbbAbA) .A. (bbbbAbbbb)
Run Code Online (Sandbox Code Playgroud)

我想用''替换括号中的所有'A',最后像这样:

A. (bbbb) .A. (bbbbb) .A. (bbbbbbbb)
Run Code Online (Sandbox Code Playgroud)

任何可能只在正则表达式中执行此操作?

Wik*_*żew 5

使用Python re,不可能只使用普通的正则表达式,你可以在里面使用替换回调方法re.sub.

如果你想删除所有A内部,(...)你可以使用

re.sub(r'\([^()]+\)', lambda x: x.group().replace('A', ''), s)
Run Code Online (Sandbox Code Playgroud)

这里,\([^()]+\)匹配(,除了(和之外的1+个字符),然后是a ),将匹配值传递给lambda表达式(x),并且可以通过访问匹配文本m.group()(如果定义捕获组,则可以访问它们.group(n)).只需一点replace('A', ''),就可以实现您的需求.

请参阅Python演示

如果使用PyPi正则表达式模块,可以使用普通正则表达式完成相同的操作:

regex.sub(r'(?<=\([^()]*)A(?=[^()]*\))', '', s)
Run Code Online (Sandbox Code Playgroud)

请参阅此Python演示.

在这里,使用了lookarounds,这是有效的,因为PyPi支持无限宽度的lookbehinds.

  • @minion请参阅http://regex101.com/r/FH1zBY/1,最后删除`A`并且它不在括号内.那么,在括号之间定义一个字符串是一个问题.`((A)`在括号内?如果是,你应该在我的模式中用`[^)]`替换所有`[^()]`.如果你还决定`(bb(d(dcv)A))`中的`A`也在括号内,你需要一个不同的方法.使用PyPi正则表达式,它将是`regex.sub(r'\((?:[^()] ++ |(?R))*\)',lambda x:x.group().replace('A ',''),s)`. (2认同)

rev*_*evo 5

这种情况有一个共同的解决方法 - 不应存在不平衡/嵌套括号(因为它们).您在A不匹配括号的情况下查找关闭括号后面的s:

A(?=[^)(]*\))
Run Code Online (Sandbox Code Playgroud)

现场演示

Python代码:

re.sub(r"A(?=[^)(]*\))", "", str)
Run Code Online (Sandbox Code Playgroud)