python正则表达式之作业计算器

Jun 10, 2016 pm 03:05 PM
Pythonの正規表現

作业:计算器开发

实现加减乘除及拓号优先级解析
用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致
一、说明:

有一点bug就是不能计算幂次方,如:'6**6'会报错

该计算器思路:
1、没用使用递归,先找出并计算所有括号里的公式,再计算乘除和加减
2、所有的数字都认为是浮点型操作,以此来保留小数
使用技术:
1、正则表达式
2、tkinter

二、流程图:

 

 三、代码如下:

#!/usr/bin/env python3
#antuor:Alan
 
import re
from functools import reduce
from tkinter import *
 
 
 
'''处理特殊-号运算'''
def minus_operation(expresstion):
  minus_operators = re.split("-",expresstion)
  calc_list = re.findall("[0-9]",expresstion)
  if minus_operators[0] =="":
    calc_list[0] = '-%s' % calc_list[0]
  res = reduce(lambda x,y:float(x)-float(y),calc_list)
  print(">>>>>>>>>>>>>>减号[%s]运算结果:" % expresstion,res)
  return res
 
'''reduce()对sequence连续使用function, 如果不给出initial, 则第一次调用传递sequence的两个元素,
以后把前一次调用的结果和sequence的下一个元素传递给function'''
 
 
 
 
'''处理双运算符号'''
def del_duplicates(expresstion):
  expresstion = expresstion.replace("++","+")
  expresstion = expresstion.replace("--","-")
  expresstion = expresstion.replace("+-","-")
  expresstion = expresstion.replace("--","+")
  expresstion = expresstion.replace('- -',"+")
  e
  return expresstion
 
'''*/运算函数'''
def mutiply_dividend(expresstion):
  calc_list = re.split("[*/]",expresstion)     #用* or /分割公式
  operators = re.findall("[*/]",expresstion)    #找出所有*和/号
  res = None
  for index,i in enumerate(calc_list):
    if res:
      if operators[index-1] =='*':
        res *= float(i)
      elif operators[index-1] =='/':
        res /=float(i)
    else :
      res = float(i)
  procession0 = "[%s]运算结果=" % expresstion,res
  final_result.insert(END,procession0)    #插入窗体
  print(procession0)
  return res
 
 
 
'''处理运算符号顺序混乱情况'''
def special_features(plus_and_minus_operators,multiply_and_dividend):
 
  for index,i in enumerate(multiply_and_dividend):
    i = i.strip()
    if i.endswith("*") or i.endswith("/"):
      multiply_and_dividend[index] = multiply_and_dividend[index] + plus_and_minus_operators[index] + multiply_and_dividend[index+1]
      del multiply_and_dividend[index+1]
      del plus_and_minus_operators[index]
  return plus_and_minus_operators,multiply_and_dividend
 
 
 
def minus_special(operator_list,calc_list):
  for index,i in enumerate(calc_list):
    if i =='':
      calc_list[index+1] = i + calc_list[index+1].strip()
 
 
 
'''运算除了()的公式+-*/'''
def figure_up(expresstion):
  expresstion = expresstion.strip("()")    #去掉外面括号
  expresstion = del_duplicates(expresstion)  #去掉重复+-号
  plus_and_minus_operators = re.findall("[+-]",expresstion)
  multiply_and_dividend = re.split("[+-]",expresstion)
  if len(multiply_and_dividend[0].strip()) ==0:
    multiply_and_dividend[1] = plus_and_minus_operators[0] + multiply_and_dividend[1]
    del multiply_and_dividend[0]
    del plus_and_minus_operators[0]
 
  plus_and_minus_operators,multiply_and_dividend = special_features(plus_and_minus_operators,multiply_and_dividend)
  for index,i in enumerate(multiply_and_dividend):
    if re.search("[*/]",i):
      sub_res = mutiply_dividend(i)
      multiply_and_dividend[index] = sub_res
 
  print(multiply_and_dividend,plus_and_minus_operators)  #计算
  final_res = None
  for index,item in enumerate(multiply_and_dividend):
    if final_res:
      if plus_and_minus_operators[index-1] == '+':
        final_res += float(item)
      elif plus_and_minus_operators[index-1] == '-':
        final_res -= float(item)
    else:
      final_res = float(item)
  procession = '[%s]计算结果:' % expresstion,final_res
  final_result.insert(END,procession)    #插入窗体
  print(procession)
  return final_res
 
"""主函数:运算逻辑:先计算拓号里的值,算出来后再算乘除,再算加减"""
def calculate():
  expresstion = expresstions.get()         #获取输入框值
  flage = True
  calculate_res = None               #初始化计算结果为None
  while flage:
    m = re.search("\([^()]*\)",expresstion)    #先找最里层的()
    # pattern = re.compile(r"\([^()]*\)")
    # m = pattern.match(expresstion)
    if m:
      sub_res = figure_up(m.group())      #运算()里的公式
      expresstion = expresstion.replace(m.group(),str(sub_res))  #运算完毕把结果替换掉公式
    else:
      print('---------------括号已经计算完毕--------------')
      procession1 = "最终计算结果:",figure_up(expresstion)
      final_result.insert(END,procession1)   #插入窗体
      print('\033[31m最终计算结果:',figure_up(expresstion))
 
      flage = False
 
 
if __name__=="__main__":
  # res = calculate("1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")
  window = Tk()         ###创建窗体
  window.title('计算器')    ###命名窗体
  frame1 = Frame(window)    ###框架1
  frame1.pack()        ###放置
  frame2 = Frame(window)    ###框架2
  frame2.pack()        ###放置
  lable = Label(frame1,text = "请输入公式:")  ###文字标签
  lable.pack()
  expresstions = StringVar()  ###输入框属性,字符串
  entryname = Entry(frame1,textvariable = expresstions) ###文本输入框
  bt_get_expresstions = Button(frame1,text = "提交",command = calculate) ###按钮挂件
  bt_get_expresstions.pack()
  entryname.pack()
  lable.grid(row =1,column =1)  ###位置
  entryname.grid(row=1,column =2)
  bt_get_expresstions.grid(row =1,column =3)
  final_result = Text(frame2)  ###计算结果显示框
  final_result.tag_config("here", background="yellow", foreground="blue")
  final_result.pack()
  window.mainloop()       ###事件循环
ログイン後にコピー

以上就是本文的全部内容,希望对大家的学习有所帮助。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Word ファイル処理に Python 正規表現を使用する方法 Word ファイル処理に Python 正規表現を使用する方法 Jun 22, 2023 am 09:57 AM

Python の正規表現は、Word ファイル処理でテキスト、スタイル、形式を迅速に識別して置換するのに役立つ強力なマッチング ツールです。この記事では、Word ファイル処理に Python 正規表現を使用する方法を紹介します。 1. Python-docx ライブラリをインストールする Python-docx は、Word 文書を Python で処理するための機能ライブラリで、Word 文書の読み取り、変更、作成、保存をすばやく行うことができます。 Python-docx を使用する前に、次のことを確認する必要があります。

Python 正規表現を使用して数値と金額を処理する方法 Python 正規表現を使用して数値と金額を処理する方法 Jun 23, 2023 am 08:21 AM

Python の正規表現は、テキスト データの正確かつ効率的な一致と検索を実行するのに役立つ強力なツールです。正規表現は数値や金額の処理にも非常に役立ち、数値や金額の情報を正確に検索して抽出できます。この記事では、Python 正規表現を使用して数値と金額を処理する方法を紹介し、読者が実際のデータ処理タスクにうまく対処できるようにします。 1. 数値の処理 1. 整数と浮動小数点数の照合 正規表現では、整数と浮動小数点数を照合するには、d+ を使用して照合します。

コンテナ オーケストレーションに Python 正規表現を使用する方法 コンテナ オーケストレーションに Python 正規表現を使用する方法 Jun 22, 2023 am 09:16 AM

コンテナオーケストレーションでは、多くの場合、一部の情報をフィルタリング、照合、置換する必要があります。 Python は、これらの操作を完了するのに役立つ強力なツールである正規表現を提供します。この記事では、正規表現の基本知識、Pythonre モジュールの使用方法、一般的な正規表現アプリケーションなど、コンテナ オーケストレーションに Python 正規表現を使用する方法を紹介します。 1. 正規表現の基礎知識 正規表現( RegularExpression )とは、テキストのパターンを指します。

単語の分割に Python 正規表現を使用する方法 単語の分割に Python 正規表現を使用する方法 Jun 23, 2023 am 10:37 AM

Python 正規表現は、テキスト データを処理するための強力なツールです。自然言語処理では、テキストを個々の単語に分割する単語分割が重要なタスクです。 Python では、正規表現を使用して単語の分割タスクを完了できます。以下では、Python3 を例として、単語の分割に正規表現を使用する方法を紹介します。 re モジュールのインポート re モジュールは Python の組み込み正規表現モジュールなので、最初にモジュールをインポートする必要があります。定義テキストをインポートする

Python正規表現とラテックス解析ライブラリを使用して、ラテックスフォーミュラで多層ブラケットを処理する方法は? Python正規表現とラテックス解析ライブラリを使用して、ラテックスフォーミュラで多層ブラケットを処理する方法は? Apr 01, 2025 pm 12:45 PM

Python正規表現は、ラテックスの多層ブラケットを処理し、多くのラテックスで多次元辞書を構築します...

コードのリファクタリングに Python 正規表現を使用する方法 コードのリファクタリングに Python 正規表現を使用する方法 Jun 23, 2023 am 09:44 AM

日常のコーディングでは、コードの読みやすさと保守性を高めるために、コードを変更したり再構築したりする必要があることがよくあります。重要なツールの 1 つは正規表現です。この記事では、コードのリファクタリングに Python 正規表現を使用する方法に関する一般的なテクニックをいくつか紹介します。 1. 検索と置換 正規表現で最もよく使用される機能の 1 つは、検索と置換です。コード内のすべての print ステートメントを logging ステートメントに置き換える必要があるとします。次の正規表現を使用して検索できます: prints*((.

コンテンツ抽出に Python 正規表現を使用する方法 コンテンツ抽出に Python 正規表現を使用する方法 Jun 22, 2023 pm 03:04 PM

Python は、コンテンツの抽出をより簡単かつ効率的に行う豊富なライブラリとツールを備えた、広く使用されている高水準プログラミング言語です。その中でも正規表現は非常に重要なツールであり、Python ではコンテンツ抽出に正規表現を使用するための re モジュールが提供されています。この記事では、Python 正規表現を使用してコンテンツを抽出する具体的な手順を紹介します。 1. 正規表現の基本構文を理解する コンテンツ抽出に Python 正規表現を使用する前に、まず正規表現の基本構文を理解する必要があります。

コードの美しさとユーザー エクスペリエンスのために Python 正規表現を使用する方法 コードの美しさとユーザー エクスペリエンスのために Python 正規表現を使用する方法 Jun 22, 2023 am 08:45 AM

ソフトウェア開発では、コードの美しさとユーザー エクスペリエンスが無視されることが多く、実際の使用時に多くのソフトウェア問題が発生します。 Python は強力なプログラミング言語として、これらの問題を解決するための強力なツールとして正規表現を提供します。この記事では、コードの美しさとユーザー エクスペリエンスのために Python 正規表現を使用する方法を紹介します。 1. Python 正規表現の概要 正規表現はテキスト パターンを記述する言語であり、テキストの一致、検索、置換、分割に使用できます。 Python の re モジュールが提供するもの

See all articles