Pythonは、N列の計算式を用いて達成されます
実際には、文字列の直接発現を算出するため特に便利で実用的な方法がある。パイソン
それのeval()
s = '1+2*(6/2-9+3*(3*9-9))' print(eval(s)) #97.0
まあ、私は今、このような定期的な機能の何かを書きたいです
まず、我々のような'1 + 2、式を取得(6/3 2-9 + * 9-9(3))'
小学校の知識によると、我々は方程式の最も内側の括弧からカウントされなければならないことを知っている必要があります
次に、どのように我々は式それの最も内側のブラケットを得るのですか?私たちは定期的にああを使用することができます
import re pattern = re.compile(r'\([^(^)]*?\)') s = '1+2*(6/2-9+3*(3*9-9))+(6-3)' ret = pattern.findall(s) print(ret) #['(3*9-9)','(6-3)']
さて、今私たちは、最も内側の括弧を持って、式の内部、および最初のステップを完了します
第二段階は、我々は括弧なしでそれにコンテンツを取得したいです
私たちは式のブラケットを削除するには、それを維持するために、新しいリストを使用して、我々は、最も内側の括弧は、複数のかもしれ得るので
ret2 = [] pattern2 = re.compile(r'\((?P<tag>.*?)\)') for i in range(len(ret)): ret3 = pattern2.search(ret[i]) ret2.append(ret3.group('tag')) print(ret2) #['3*9-9', '6-3']
実際には、ここでは、成功のほぼ半分を持っています
第3のステップは、我々は最も内側のブラケットを得る式を手配します
ここでの唯一のプレゼンテーションロジックが、私はちょうど '* 9-9 3' 取る(RET2を[1])があります
我々はまだ論理演算、第1の乗算、除算、加算と減算の後に基づくものでなければなりません
乗除
def mul_div(s): if '*' in s: s = s.split('*') return float(s[0]) * float(s[1]) elif '/' in s: s = s.split('/') return float(s[0]) / float(s[1]) while True: pattern3 = re.compile(r'[-+*/]?(?P<tag>-?\d+(\.\d+)?[*/]-?\d+(\.\d+)?)') ret3 = pattern3.search(ret2[1]) try: ret4 = ret3.group('tag') except Exception as e: pass if '*' not in ret2[1] and '/' not in ret2[1]: break else: ret2[1] = ret2[1].replace(ret4, str(mul_div(ret4)))
- ここでのコードは、あることを理解しないことがあり、私が説明しましょう
- 計算の乗算と除算最初mul_div()への一つの方法は、彼らの定義です
- 正規表現ので、制約、および文字列は文字のみ+「/」+ +文字または文字「*」は文字+で得ることができるように、検索しています。そこでここでは、文字列のカットは、2乗の要素、および除算番号のリストに応じてカットされます
- 私たちは、文字または文字の文字+ +「/」+ +「*」文字の値を計算し、我々はなし乗算、除算数まで、この文字列を定期的に一致する文字列を置き換えるために計算された値を使用します。
加減
def add_sub(s): if '+' in s: s = s.split('+') return float(s[0]) + float(s[1]) else: if s[0] == '-': s = s[1::].split('-', 1) s[0] = '-' + s[0] return float(s[0]) - float(s[1]) else: s = s.split('-', 1) return float(s[0]) - float(s[1]) while True: pattern3 = re.compile(r'-?\d+(\.\d+)?[-+]-?\d+(\.\d+)?') ret3 = pattern3.search(ret2[i]) try: ret4 = ret3.group() except Exception as e: pass if '+' not in ret2[i] and '-' not in ret2[i][1::]: break else: ret2[i] = ret2[i].replace(ret4, str(add_sub(ret4)))
- 加算および上記減算、乗算、除算は大きな違いではありません
- 唯一の違いは、残りの位置は依然としてマイナス記号が存在するかどうか、裁判官が終了すると、数が負であってもよく、それは直接的に決定することができないマイナス記号が存在するかどうか、第一の位置に加えて判断する必要があるということです
第四段階
我々は両方のそれに置き換えられますので、ここでは、すべて私たちの最も内側の括弧は、このリストのRET2の内部に数を計算し、我々は括弧内に保存されRET1は、ほかの内側などとして方程式の最も内側の層であり、
def str_replace(lst1,lst2): for i in range(len(lst1)): global str1 str1 = str1.replace(lst1[i], lst2[i]) str_replace(ret1,ret2)
第五の工程
実際には、ここで我々は成功から離れた小さな一歩を送りました
あなたは発見しているかもしれませんが、それはない、最終的なブラケットがそれを動作しませんであれば、我々は、括弧の操作で式であること、下方に設定されていることを、我々は、文字列に来たときにスリーブの最外層OKのブラケット
str1 = '1+2*(6/2-9+3*(3*9-9))' str1 = '( )'.replace(' ',str1)
何の括弧がなくなるまで続い式は、上記の手順を繰り返します。
完全なコード
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
# 乘除法
def mul_div(s):
if '*' in s:
s = s.split('*')
return float(s[0]) * float(s[1])
elif '/' in s:
s = s.split('/')
return float(s[0]) / float(s[1])
# 加减法
def add_sub(s):
if '+' in s:
s = s.split('+')
return float(s[0]) + float(s[1])
else:
if s[0] == '-':
s = s[1::].split('-', 1)
s[0] = '-' + s[0]
return float(s[0]) - float(s[1])
else:
s = s.split('-', 1)
return float(s[0]) - float(s[1])
# 替换字符串
def str_replace(lst1,lst2):
for i in range(len(lst1)):
global str1
str1 = str1.replace(lst1[i], lst2[i])
# 匹配最内层括号
pattern1 = re.compile(r'\([^(^)]*?\)')
str1 = '1+2*(6/2-9+3*(3*9-9))'
str1 = '( )'.replace(' ',str1)
while True:
if '(' not in str1 and ')' not in str1:
break
ret1 = pattern1.findall(str1)
# 匹配括号内的内容
ret2 = []
pattern2 = re.compile(r'\((?P<tag>.*?)\)')
for i in range(len(ret1)):
ret = pattern2.search(ret1[i])
ret2.append(ret.group('tag'))
# 计算乘除法
while True:
pattern3 = re.compile(r'[-+*/]?(?P<tag>-?\d+(\.\d+)?[*/]-?\d+(\.\d+)?)')
ret3 = pattern3.search(ret2[i])
try:
ret4 = ret3.group('tag')
except Exception as e:
pass
if '*' not in ret2[i] and '/' not in ret2[i]:
break
else:
ret2[i] = ret2[i].replace(ret4, str(mul_div(ret4)))
# 计算加法
while True:
pattern3 = re.compile(r'-?\d+(\.\d+)?[-+]-?\d+(\.\d+)?')
ret3 = pattern3.search(ret2[i])
try:
ret4 = ret3.group()
except Exception as e:
pass
if '+' not in ret2[i] and '-' not in ret2[i][1::]:
break
else:
ret2[i] = ret2[i].replace(ret4, str(add_sub(ret4)))
str_replace(ret1,ret2)
print(str1)
#97.0
- 結論
- ホープ誰かソーは、Tucao私RET1-ret4は、変数の名前はありません
- 私は明確に記述する必要があればそこに知っていない、人々はNengkanmingbaiを見ることができない、睡眠のない夜の後、脳はそうかもしれません。
- 私は、参照のみを目的としてので、コードを最適化するためにたくさん持っていることを確信しています。
- ハッハッハハッハッハハッハッハハッハッハハッハッハハッハッハハッハッハハッハッハハッハッハハッハッハ