2013-04-04 6 views
0

У меня есть числовые строки в Фортран формате, которые выглядят как этот 0.1245-102 преобразования поплавок не работает, потому что формат не ожидается: 0.1245e-102заменить регулярное выражение питона

Я использую эту команду

re.sub(r"[0-9]-[0-9]",r"e-","0.1245-102")

Я очень новичок в регулярном выражении и таким образом получаю 0.124e-02 Как я могу сохранить 5e-1 в новом результате?

+0

Почему бы не просто «0.1245-102'.replace ('-', 'e -')'? –

+0

@PavelAnossov - сбой для отрицательных чисел – mgilson

+0

@mgilson: oops. –

ответ

3

Вы ищете:

r'(?<=\d|\.)-(?=\d)' 

, который соответствует -, если есть цифры или точка) до и после цифр.

Демо:

>>> exponent = re.compile(r'(?<=\d|\.)-(?=\d)') 
>>> exponent.sub('e-', '0.1245-102') 
'0.1245e-102' 
>>> float(exponent.sub('e-', '0.1245-102')) 
1.245e-103 
>>> float(exponent.sub('e-', '1-10')) 
1e-10 
>>> float(exponent.sub('e-', '1.-10')) 
1e-10 
>>> float(exponent.sub('e-', '-1-10')) 
-1e-10 

Для обработки как - и D+ (положительные и отрицательные показатели), вы можете использовать:

r'(?<=\d|\.)D?(?=(?:\+|-)\d) 

, которые позволили бы заменить дополнительный D, оставляя - или + на месте при замене:

>>> exponent = re.compile(r'(?<=\d|\.)D?(?=(?:\+|-)\d)') 
>>> float(exponent.sub('e', '0.1245-102')) 
1.245e-103 
>>> float(exponent.sub('e', '456D+5')) 
45600000.0 

Этот делает, а также , также предшествует -, поэтому 0.1245D-102 также будет действительным, но это упростит обработку замены.

+0

да, это звучит так. Я забыл позитивный экспонент, похожий на этот «456D + 5» – froggy

+0

да, но он не подходит для позитива, должен ли я включать этот вызов в try-except test? или есть другая вещь, связанная с функцией компиляции? – froggy

+0

Каковы ваши положительные показатели * смотрите * как? Вы можете выполнить 'try: except:' или первый тест, если есть совпадение. –

Смежные вопросы