Search code examples
pythonregexpython-re

RegEx removing pair parantheses only


How to replace only pair parentheses by nothing in this expression? I tried many ways, but then I decided to post my question here...

Code:

expression = ')([()])('
pattern = r'[(\(.*\)]'
nothing = ''
print(re.sub(pattern, nothing, expression))  # Expected to be ')[]('

Another expressions to validating:

// True
<s>HTML is a programming language</s>
(1+2) * (3+4) / 4!
{1, 2, 3, ..., 10}
([{<>}])

// False
<}>
)[}({>]<
<[{}]><

As you guess, I want to solve a classic problem in new way... Not only parentheses, another punctuation marks such as brackets, angle brackets, and braces should be removed. (Use re.sub(r'[^\(\)\[\]\{\}\<\>]', '', expr) to clean them)

I want to drop them in one step, but all answers are accepted...


Solution

  • Based on How to remove all text between the outer parentheses in a string?:

    import re
    def rem_parens(text):
        n = 1  # run at least once
        while n:
            text, n = re.subn(r'\(([^()]*)\)', r'\1', text)
        return text
    
    print(rem_parens(")([()])("))
    

    Results: )[](

    See Python proof

    How to extend to accept more bracket types

    Add alternatives to the expression and backreferences to the replace:

    re.subn(r'\(([^()]*)\)|\[([^][]*)]|<([^<>]*)>|\{([^{}]*)}', r'\1\2\3\4', text)