当前位置: 首页 > 知识库问答 >
问题:

如何删除字符串中外括号之间的所有文本?

朱宇航
2023-03-14

当我有一个这样的字符串:

s1 = 'stuff(remove_me)'

我可以很容易地删除括号和文本

# returns 'stuff'
res1 = re.sub(r'\([^)]*\)', '', s1)

正如这里所解释的。

但我有时会遇到这样的嵌套表达式

s2 = 'stuff(remove(me))'

当我从上面运行命令时,我最终

'stuff)'

我也试过:

re.sub('\(.*?\)', '', s2)

这给了我同样的输出。

我如何删除外括号内的所有内容——包括括号本身——这样我也会得到'东西'(这应该适用于任意复杂的表达式)?

共有3个答案

陈翰林
2023-03-14

re匹配非常迫切,因此它们会尝试匹配尽可能多的文本,对于您提到的简单测试用例,只需让regex运行即可:

>>> re.sub(r'\(.*\)', '', 'stuff(remove(me))')
'stuff'
阎承嗣
2023-03-14

如前所述,您需要一个递归正则表达式来匹配任意级别的嵌套,但是如果您知道最多只能有一个级别的嵌套,请尝试使用此模式:

\((?:[^)(]|\([^)(]*\))*\)
  • [^)(]匹配一个字符,这不是括号(否定类)。
  • |\([^)(]*\)或者它匹配另一个对与任何数量的非)(内部。
  • (?:...)*所有这一切在
  • 内的任何时间

这是regex101的演示

在交替之前,使用[^)(]而不使用量词,如果不平衡,则会更快失败。
您需要添加更多可能发生的嵌套级别。例如最多2个级别:

\((?:[^)(]|\((?:[^)(]|\([^)(]*\))*\))*\)

regex101上的另一个演示

翟宾实
2023-03-14

注意:\(.*\)匹配左边的第一个),然后匹配直到最后一个的任何0个字符(如果未启用DOTALL修饰符,则不匹配换行符),并且不考虑正确嵌套的括号。

要使用Python中的正则表达式正确地删除嵌套的括号,您可以使用一个简单的\([^()]*\)(匹配一个,然后是之外的0个字符,然后是一个),然后使用re.subn

def remove_text_between_parens(text):
    n = 1  # run at least once
    while n:
        text, n = re.subn(r'\([^()]*\)', '', text)  # remove non-nested/flat balanced parts
    return text

基本:删除(…) 内部没有,直到找不到匹配项。用法:

print(remove_text_between_parens('stuff (inside (nested) brackets) (and (some(are)) here) here'))
# => stuff   here

也可以使用非regex方式:

def removeNestedParentheses(s):
    ret = ''
    skip = 0
    for i in s:
        if i == '(':
            skip += 1
        elif i == ')'and skip > 0:
            skip -= 1
        elif skip == 0:
            ret += i
    return ret

x = removeNestedParentheses('stuff (inside (nested) brackets) (and (some(are)) here) here')
print(x)              
# => 'stuff   here'

请看另一个Python演示

 类似资料:
  • 我试图找出从字符串中删除所有标点符号和空格的正确方法,但保留撇号不变,例如: 不会留下来,但“欲望”会变成“欲望”。 我试过使用

  • 问题内容: 我想使用Java删除字符串中所有类型的方括号字符(例如:[],(),{})。 我尝试使用此代码: 但这不起作用,请帮助我。 问题答案: 要删除 _ 所有标点符号_ ,包括所有方括号,大括号和方括号…,按问题是:

  • 我得到了这样的回应 因此,在使用时,由于前面有文本“stripe\product json:”,所以我得到了一个错误 请帮忙

  • 问题内容: 我从来不是一个正则表达式大师,所以我需要您的帮助!我有一个像这样的字符串: 我想使用空格作为定界符来分割此字符串-但我不想分割在方括号内出现的空格。因此,从上面的示例中,我想要这个数组: 关于什么正则表达式的任何建议可以结合使用以实现这一目标? 这是另一个例子: 变成 问题答案: 我认为这应该起作用,使用负前瞻 -不匹配在没有括号的情况下关闭括号之前没有的空格: 对于嵌套的括号,您将需

  • 问题内容: 我只是想知道如何在php中删除一组括号和括号本身之间的文本。 范例: ABC(测试1) 我想删除(Test1),只离开ABC 谢谢 问题答案: 是基于Perl的正则表达式替换例程。该脚本的作用是匹配所有出现的右括号,后跟任意数量的字符 而不是 右括号,然后再次跟右括号,然后删除它们: 正则表达式细目:

  • 问题内容: 例如: 我可以这样做吗? 问题答案: 一个非常简单的实现是: 并继续添加任何其他类型的标点符号。 一种更有效的方法是 编辑:这里有关于效率和其他实现的更多讨论: 在Python中从字符串中删除标点符号的最佳方法