1

假设我有以下字符串:

thestring = "1) My Favorite Pokemon Charizard *22.00 MP* [Pre-Avatar Mode Cost: 15.75 MP] [Post-Avatar Mode Cost: 6.250 MP]"

其他一些样本可能是:

thestring = "1) My Favorite Pokemon Mew *1 MP* [Pre-Avatar Mode Cost: 0.5 MP] [Post-Avatar Mode Cost: 0.5 MP]"

thestring = "1) My Favorite Pokemon Pikachu *6.25 MP* [Pre-Avatar Mode Cost: 5 MP]; [Post-Avatar Mode Cost: 1.25 MP]"

(第三种情况的冒号是故意的)

如何最好地提取“Pre-Casting Cost”和“Post-Avatar Mode Cost”的值?我听到了正则表达式,也听到了 string.find 方法,但我不确定完成此操作的最佳方法是什么。请注意,虽然“前头像模式成本”可能是 15.75 MP,但也可能取决于品种,也可能是 15.752 或包含多个小数位。语法受到赞赏。

更新:

我正在使用 Python 2.7。最接近的答案如下:

m = re.match('\[Pre-Avatar Mode Cost: (?P<precost>\d(\.\d*){0,1}) MP\] \[Post-Avatar Mode Cost: (?P<postcost>\d(\.\d*){0,1}) MP\]', '1) My Favorite Pokemon Mew *1 MP* [Pre-Avatar Mode Cost: 0.5 MP] [Post-Avatar Mode Cost: 0.5 MP]')

虽然它看起来实际上并没有正确匹配,但由于没有匹配,导致 m 结果为“Nonetype”。

我通过使用以下内容进行了轻微更改:

m = re.match('(.*)\[.*(?P<precost>\d+(\.\d*){0,1}).*\].*\[.*(?P<postcost>\d+(\.\d*){0,1}).*\]', '1) My Favorite Pokemon Mew *1 MP* [Pre-Avatar Mode Cost: 0.5 MP] [Post-Avatar Mode Cost: 0.5 MP]')

虽然看起来 precost 和 postcost 都等于“5”。知道正则表达式可能有什么问题吗?

4

4 回答 4

2

http://docs.python.org/2/howto/regex.html

这是所需的分组:

m = re.match('\[Pre-Avatar Mode Cost\: (?P<precost>\d(?:\.\d*)?) MP\] \[Post-Avatar Mode Cost\: (?P<postcost>\d(?:\.\d*)?) MP\]', '1) My Favorite Pokemon Mew *1 MP* [Pre-Avatar Mode Cost: 0.5 MP] [Post-Avatar Mode Cost: 0.5 MP]')

以下是您访问群组的方式:

m.group('precost')
m.group('postcost')

如果您不关心字符串的内容并且知道值在 2 个方括号中,您可以:

m = re.match('\[.*?(?P<precost>\d+(?:\.\d*)?).*?\].*?\[.*?(?P<postcost>\d+(?:\.\d*)?).*\]', 'your long string')
m.group('precost')
m.group('postcost')
于 2012-10-29T02:15:48.550 回答
1

我认为正则表达式是最好的选择:

pattern = re.compile(r"\[.*?([0-9]+(?:\.[0-9]+)?).*?\]")
pre, post = [float(x) for x in re.findall(pattern, thestring)]

无论小数位数(或缺少)如何,这都应该有效。

于 2012-10-29T02:31:47.207 回答
0

这可能会对您正在搜索的文本中没有的内容做出太多假设,但肯定会更短并且可能更快:

re.findall('\[Pre[^:]+:\s+(?P<precost>\S+)[^[]+\[Post[^:]+:\s+(?P<postcost>\S+)', 
    thestring)
[('5', '1.25')]

这些假设可能不正确:

  • 在成本之后和“PM”之前总是有一个空格。
  • 方括号内的冒号只出现一次,并且总是放在“成本”之后。
  • 括号内没有任何其他以“Pre”或“Post”序列开头的组。
于 2012-10-29T09:25:43.733 回答
-1

绝对是 RegEx,因为它非常精确。我没有看到您所说的“预铸成本”部分。也许您的意思是“前头像模式”?

但是对于后头像模式成本,您必须考虑某些文本的一致性。如果您知道“Post-Avatar Mode Cost:”始终是一致的分隔符,您可以做一个简单的匹配。

假设您想要浮点值,您可以执行以下操作:

import re
post_avatar_cost = re.match("\[Post-Avatar Mode Cost: (?P<PostCost>[0-9]*\.[0-9]*) MP\]")
post_avatar_cost = post_avatar_cost.group('PostCost')

这会给你一个浮点数(作为一个字符串)。例如,我在这里做了很多假设,我正在快速写一些东西给你一个想法。但是您可以循环使用它来找到所有这些值。

这个页面将是你最好的朋友:http ://docs.python.org/2/library/re.html

于 2012-10-29T02:18:21.523 回答