0

我在 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 等)

4

2 回答 2

2

您需要使第一个.*匹配不贪心(添加 a ?),否则它会吞下数字:

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',)
于 2012-10-29T17:21:58.640 回答
1

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

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

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

于 2012-10-29T17:24:35.593 回答