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
添加回答
舉報