Produce a string convertable with float(s), if possible, fixing some common scientific notations

    Deletes commas and allows addition.
    >>> normalize_scientific_notation(' -123 x 10^-45 ')
    '-123e-45'
    >>> normalize_scientific_notation(' -1+1,234 x 10^-5,678 ')
    '1233e-5678'
    >>> normalize_scientific_notation('$42.42')
    '42.42'

def normalize_scientific_notation(s, ignore_commas=True, verbosity=1):
    """Produce a string convertable with float(s), if possible, fixing some common scientific notations

    Deletes commas and allows addition.
    >>> normalize_scientific_notation(' -123 x 10^-45 ')
    '-123e-45'
    >>> normalize_scientific_notation(' -1+1,234 x 10^-5,678 ')
    '1233e-5678'
    >>> normalize_scientific_notation('$42.42')
    '42.42'
    """
    s = s.lstrip(charlist.not_digits_nor_sign)
    s = s.rstrip(charlist.not_digits)
    # print s
    # TODO: substitute ** for ^ and just eval the expression rather than insisting on a base-10 representation
    num_strings = rex.scientific_notation_exponent.split(s, maxsplit=2)
    # print num_strings
    # get rid of commas
    s = rex.re.sub(r"[^.0-9-+" + "," * int(not ignore_commas) + r"]+", '', num_strings[0])
    # print s
    # if this value gets so large that it requires an exponential notation, this will break the conversion
    if not s:
        return None
    try:
        s = str(eval(s.strip().lstrip('0')))
    except (IndexError, ValueError, AttributeError, TypeError):
        if verbosity > 1:
            print('Unable to evaluate %s' % repr(s))
        try:
            s = str(float(s))
        except (IndexError, ValueError, AttributeError, TypeError):
            print('Unable to float %s' % repr(s))
            s = ''
    # print s
    if len(num_strings) > 1:
        if not s:
            s = '1'
        s += 'e' + rex.re.sub(r'[^.0-9-+]+', '', num_strings[1])
    if s:
        return s
    return None