2014-01-18 3 views
0

У меня есть большое математическое выражение в текстовый файл, который выглядит примерно так,Замена целых чисел в математическом выражении

Z3N = -24*y[1]*r*pow(EXP,-2.0*phi)*y[5]*y[5]+(32*r-44*y[1]*r+32*r*y[4]) 

только намного дольше. Я бы хотел написать код python, который изменит все целые числа, появляющиеся выше, в float. Таким образом, 24 становится 24.0, 32 становится 32.0. Есть ли простой способ сделать это?

+0

Почему вы это делаете? – bozdoz

+5

Не задействовано деление. Какая разница? – thefourtheye

+1

Я предполагаю, что вы хотите исключить целые числа '1',' 5' и '4', потому что индексы индексов должны быть целыми, а не плавать? – DSM

ответ

1

Несмотря на то, что я понятия не имею, почему вы хотите это сделать, вы можете использовать RegExes для этого легко. У:

import re 
Z3N = re.sub(r"\b(?<!\.)(\d+)(?!\.)\b", r"\1.0", Z3N) 

Если вы не хотите, чтобы соответствовать индексы списка используйте этот Regex:

\b(?<!\.|\[)(\d+)(?!\.|\])\b 

EDIT: Добавлено объяснение.
(\d+) соответствует любому количеству цифр, т. Е. Любому целому числу, и фиксирует его для последующего использования.

(?<!\.|\[) называют отрицательным просмотра назад, это означает, что целое число не должно предшествовать либо точка или открытия квадратной скобки, тем самым исключая любые индексы и цифры, которые уже являются частью поплавка, т.е. .0. \b называется границей слов и mathches, где слово «слово» и «не-слова» «switch», поскольку цифры считаются символами слов, это исключает числа, которые являются частью идентификатора.
(?!\.|\[) - это негативный взгляд и, в основном, то же самое, что и внешний вид, он не соответствует цифрам, которые выполняются точками или закрывающимися брекетами, тем самым исключая индексы и плавающие снова.
Последнее \b гарантирует, что число, являющееся первым символом идентификатора, не заменяется по причине, описанной выше.

EDIT: Дополнительные пояснения.
\1.0 - это замена, которая означает, что каждое соответствие заменяется этой строкой. \1 заменяется содержимым первой группы захвата, которая является целым числом. Это означает, что в качестве замены вы получаете исходное целое число с добавленным .0, делая поплавок из целого числа.
И да, r лечит каждый символ буквально. \ внутри RegEx не заменяются другими символами, а являются буквальными. Однако механизм RegEx придает им особое значение.

+0

Это также будет действовать на группы цифр в словах, например 'Z3N' и' alpha2', которые, вероятно, не предназначены. – DSM

+0

Правда, я не думал об этом, так как это не произошло в данном примере, отредактировал мой ответ! – Cu3PO42

+0

Да, я хотел бы изменить только голое целое число и оставить отдельно индексы списка в квадратных скобках нетронутыми, а также числа в именах параметров, таких как Z3N. – user3188297

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