Regex splitting with multiple end brackets

Question:

I have an input of 10+sqrt(10+(100*20)+20)+sqrt(5) which I need to be able to split up into sqrt(...) as many times as sqrt appears (in this instance, twice). The problem I am having is trying to split this up, I have tried on my own and come up with this (sqrt()(?<=sqrt()(.+?)()+) but regex only registers the first ) it comes across whereas I need it to find the closing bracket.

My REGEX attempt

As you can see in the picture the orange marker only covers up to the first bracket but i need it to end at the +20.

The desired output is a list as follows:

['10+', 'sqrt(', '10+(100*20)+20', ')', '+', 'sqrt(', '5', ')']

Thanks in advance

Asked By: Hunter

||

Answers:

You don’t need to seperate the string. If you need to execute and return the result then, we can just use eval() to do it.


from math import *

query = "10+sqrt(10+(100*20)+20)+sqrt(5)"

print(eval(query))

# Output: 57.29158928177503

But if you need to just split the equation, we can use classic split(). Reason: It’s easier to manage if we don’t know no. of sqrt() in equation.

s = "10+sqrt(10+(100*20)+20)+sqrt(5)"

l = s.split('sqrt(')

d = [l[0]]

x = ''

for i in range(1, len(l)):

    if x: d.append(x)

    d.append('sqrt(')

    q = l[i]

    if i+1 == len(l): d.append(q)

    else:

        d.append(q[:-1])

        x = q[-1]



print(d)

# Output: ['10+', 'sqrt(', '10+(100*20)+20)', '+', 'sqrt(', '5)']

Peace!

Answered By: Prabhas Kumar

Here is a solution using the ast module from the standard library.
I’m assuming the expression is valid Python.

# Import parser from Python standard library
import ast

# I have an expression to process
expression = '10+sqrt(10+(100*20)+20)+sqrt(5)'

# Parse it
tree = ast.parse(expression)

# Walk the parse tree
for node in ast.walk(tree):
    # Are we a function call?
    if isinstance(node, ast.Call):
        func = node.func
        # Are we a call to 'sqrt'?
        if expression[func.col_offset:func.end_col_offset] == 'sqrt':
            # We have what we want
            start = node.col_offset
            end = node.end_col_offset
            print(expression[start:end], start, end)

This outputs…

sqrt(5) 24 31
sqrt(10+(100*20)+20) 3 23
Answered By: The Lazy Graybeard
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.