在python中这个正则表达式匹配有什么问题?

时间:2012-10-29 17:17:34

标签: python regex

我遇到了在python中匹配这个特殊正则表达式的问题,有人可以看到出了什么问题吗?

我尝试与单个正则表达式匹配的示例字符串是:

string = '[Pre-Avatar Mode Cost: 5.50 MP]'
string = '[Pre-Avatar Mode Cost: 1.2 MP]'
string = '[Pre-Avatar Mode Cost: 0.5 MP]'
string = '[Post-Avatar Mode: 0 MP]'

我尝试了以下内容,但似乎没有一个表达式匹配所有这些表达式:

m = re.match('\[.*(?P<cost>\d+(\.\d+)).*\]', string) # Appears to match only ones with #.#
m = re.match('\[.*(?P<cost>\d+(\.\d+)?).*\]', string) # Appears to match the 0 only, unable to print out m.groups for the others

我想抓住(5.50,1.2,0.5,0等)

2 个答案:

答案 0 :(得分:2)

你需要让第一个.*匹配非贪婪(添加?),否则会吞下这些数字:

r'\[.*?(?P<cost>\d+(?:\.\d+)?).*\]'

我还将可选.number部分设为非捕获组,以简化输出处理:

>>> import re
>>> costre = re.compile(r'\[.*?(?P<cost>\d+(?:\.\d+)?).*\]')
>>> costre.match('[Post-Avatar Mode: 0 MP]').groups()
('0',)
>>> costre.match('[Post-Avatar Mode: 5.50 MP]').groups()
('5.50',)
>>> costre.match('[Post-Avatar Mode: 1.2 MP]').groups()
('1.2',)

答案 1 :(得分:1)

我建议使用:作为锚点。这样,您就可以获得更强大的表达式:

r'\[.*: (?P<cost>\d+(?:\.\d+)?).*\]'

如果保证在文本中,您甚至可能希望添加MP后缀。