亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用正則表達式從字符串 驗證數學表達式

如何使用正則表達式從字符串 驗證數學表達式

小唯快跑啊 2022-08-25 14:00:37
我試圖使用python中的eval方法來評估寫在字符串中的基本數學運算,但我首先檢查字符串以確保沒有任何問題發生,這樣我就可以正確地使用eval()來評估我的字符串。以下是我現在的一些代碼:import res = ("6   + 2 ^ 2")if re.findall('\d+? *?\+ *?\d+?', s):    print(eval(s))else:    print ("Try entering a math problem")輸出是10,如我所愿。但是當我將變量s切換為等于時,我收到一條錯誤消息"6   + (2 ^  2)"“嘗試輸入數學題”相反。它仍然應該是10,但由于某種原因,我沒有得到它。由于某種原因,括號搞砸了一切。我在正則表達式中做錯了什么?
查看完整描述

1 回答

?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

準確地寫出您在正則表達式中斷言的內容很有用。在這種情況下,它是:


import re


pat = re.compile('''

\d+?                # one or more digits, taking as few as possible to match

 *?                 # zero or more literal spaces, taking as few as possible to match

\+                  # a literal plus sign

 *?                 # zero or more literal spaces, as before

\d+?                # one or more digits, as before

''', re.X)

不出所料,您不會在任何地方處理括號。你可以改用:


import re

pat = re.compile('''

\d+?                # one or more digits, taking as few as possible to match

\s?                 # one or zero space characters

\+                  # a literal plus sign

\s?                 # one or zero space characters

\(?                 # one or zero literal open parentheses

\s?                 # one or zero space characters

\d+?                # one or more digits, as before

''', re.X)

但是,您會發現沒有一個正則表達式會匹配所有可能的數學表達式。事實上,數學表達式不是正則語言,因此正則表達式不足以解析它們。你可以研究一個語法解析器,比如 ,但這里的難度是嚴重的。ast


您還應該非常清楚使用的危險。惡意用戶可以銷毀運行此代碼的計算機,因為它將作為 python 代碼進行評估。想象(但不要嘗試)以下字符串:eval


不要運行此代碼


import shutil; 2 + 2; shutil.rmtree("X:\\", ignore_errors=True)


由于 將與該部分匹配,它將整個字符串評估為python代碼,然后嘗試刪除X驅動器上的所有內容。將其替換為 C:\你有一個真正的問題。這顯然不是你的本意。re.findall2 + 2


查看完整回答
反對 回復 2022-08-25
  • 1 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號