2015-04-06 244 views
0

我正在爲DnD需求編寫助手腳本,部分腳本應接受整數或骰子符號。後者是在如何在Python正則表達式中搜索多個條件?

1d20+4 

的格式,其中我可以用任何整數替換120與和自然數,和+4。輸入可以看起來像

hit +3 damage 1d8+1 hp 3d6+2 

而且我使用re將它分成兩個列表。問題是,當我嘗試檢測死亡和數字。我知道,要檢測一些我需要使用

re.listall('[\+\-][0-9]*',input_line) 

和檢測死我需要尋找

re.listall('[0-9]*d[0-9]*',input_line) 

而且我相當肯定,以搜索與模具獎金我需要

re.listall('[0-9]*d[0-9]*[\+\-][0-9]*',input_line) 

但是,我無法計算如何搜索兩者的組合。我雖然對將它們放置在括號,即

re.listall('([\+\-][0-9]*)([0-9]*d[0-9]*)',input_line) 

但是,我得到一個錯誤sre_constants.error: unbalanced parenthesis

這讓我困惑。我該如何克服這一點?

回答

1

我認爲你需要的是這樣的正則表達式:

re.findall('((\d+d\d+)?[\+-]\d+)', input_line) 

作爲一個側面說明,您可以使用\d而不是[0-9]。所以,第二部分和你的代碼一樣。第一部分'(\d+d\d+)?'是可選的(因爲?),匹配號碼後面跟着字母d後跟一個數字。

在你的榜樣(hit +3 damage 1d8+1 hp 3d6+2),這將匹配+31d8+13d6+2

+0

謝謝,我該如何給出兩位數的選項?例如''hit + 12'' – Yotam

+0

我給你的正則表達式應該已經做到了......'\ d +'意味着一個或多個[0-9]數字。所以它應該匹配[1位或更多位] d [1位或更多位]的可選序列,然後匹配+或 - 符號,然後[1位或更多位] –

1

您可以使用與re.findall()以下的正則表達式,作爲肯定是你在你的圖案中,你可以在把\d{1,}的單詞字符的組合和+-

>>> s ='hit +3 damage 1d8+1 hp 3d6+2' 
>>> re.findall(r'([\S+-]*\d{1,}[\S+-]*)+',s) 
['+3', '1d8+1', '3d6+2'] 

Regular expression visualization

Debuggex Demo

+0

謝謝。我如何處理多位數字?例如'打+12'' – Yotam