秋名山老司機(Bugku)
python 快速計算
貼代碼·
import requests
import re
url = 'http://123.206.87.240:8002/qiumingshan/'
s = requests.session()
q = s.get(url)
match = re.search(r'(\d+[+\-*]+)+\d+',q.text).group()
b=eval(match)
payload={'value':b}
result=s.post(url,data=payload)
print (result.text)
直接print(q.text)
<head>
<title>下é¢çš„表达å¼çš„值是秋å山的车速</title>
<meta charset="UTF-8">
</head>
<p>亲请在2så†
计算è€å¸æœºçš„车速是多少</p>
<div>136827712+596201102-1362033947+389020038*1805510386+1673464924-1803233829*1633153167-1902107380-1861605492*241002176=?;</div>
<style>
div,p{
text-align: center;
margin: 0 auto;
}
</style>
之後再比對 \d 代表字元串 + [±/]代表加減乘除 + \d
group()為列印出此表達式給match,用正規表達式,\d+表示一個或者多個數字,[]裡為任意一個字元,這裡為比對±,-需要轉義,将這兩項括号括起來+,這樣才可以比對多個這樣類型的表達式,最後加上一個\d+。
import re
a = "123qqq456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123qqq456,傳回整體
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #qqq
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456
1. 正規表達式中的三組括号把比對結果分成三組
group() 同group(0)就是比對正規表達式整體結果
group(1) 列出第一個括号比對部分,group(2) 列出第二個括号比對部分,group(3)
2. 列出第三個括号比對部分。
沒有比對成功的,re.search()傳回None
^:行開頭
\d:數字
+:出現至少1次
.:任意字元,除換行和回車之外
?:出現0或1次
(.\d+)?:括号裡内出現0或1次
$:行結尾
就是說字元串是數字,并且有可能是小數,因為(.\d)?表示可能帶小數
也就是說例如 28 或者28.36都是這個正則能比對的
eval(match)
eval(expression, globals=None, locals=None) — 官方文檔中的解釋是,将字元串str當成有效的表達式來求值并傳回計算結果
可能輸出沒有結果,需要多運作幾次