2015-04-06 60 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