validate string is valid maths

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Mon Jan 28 10:43:10 EST 2008


On Mon, 28 Jan 2008 15:10:54 +0000, Matthew_WARREN wrote:

> Hi pythoners.
> 
> I am generating strings of length n, randomly from the symbols
> 
> +-/*0123456789
> 
> What would be the 'sensible' way of transforming the string, for example
> changing '3++++++8' into 3+8

That's easy: replace pairs of + into a single +, repeatedly until there's 
nothing left to replace. And so forth. Here's an untested function. It's 
probably not even close to optimal, but for playing around it is probably 
fine.

def rationalise_signs(s):
    while "++" in s or "+-" in s or "-+" in s or "--" in s:
        s = s.replace("++", "+")
        s = s.replace("--", "+")
        s = s.replace("+-", "-")
        s = s.replace("-+", "-")
    return s




> or '3++--*-9' into '3+-9' such that  eval(string) will always return a
> number?
> 
> in cases where multiple symbols conflict in meaning (as '3++--*-9' the
> earliest valid symbols in the sequence should be preserved

You have four symbols, so there are just 4*4=16 sets of two symbols. 
Probably the easiest way is to just list them and their replacements out 
in a table:

table = {"++": "+", "+-": "-", "+*": "+", "+/": "+", 
    "-+": "-", "--": "+", "-*": "-", "-/": "-", 
    "*+": "*", "**": "*", "*/": "*", 
    "/+": "/", "/*": "/", "//": "/", }

Notice that both *- and /- don't get changed.



# Untested.
def rationalise_signs(s):
    prev = ''
    while s != prev:
        prev = s
        for key, value in table.items():
            s = s.replace(key, value)
    return s



-- 
Steven



More information about the Python-list mailing list