在python中从下面的字符串中提取值的最佳方法是什么?

2024-05-13 00:17:48 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下字符串:

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

其他一些样品可以是:

^{pr2}$

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

如何最好地提取“预投成本”和“后化身模式成本”的值?我听过正则表达式,但也字符串。查找方法,但不确定什么是实现此目标的最佳方法。请注意,尽管“化身前模式成本”可能是15.75万像素,但也可能取决于种类,也可能是15.752或包含多个小数位。语法是值得赞赏的。在

更新:

我使用的是python2.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”。知道正则表达式有什么问题吗?在


Tags: 方法字符串modemymppostprefavorite
3条回答

这可能会对你正在搜索的文本中存在的而不是做出太多假设,但肯定会更短,可能更快:

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

这些假设可能不正确:

  • 总有一个空间在成本之后和“下午”之前。在
  • 方括号内的冒号只出现一次,它总是放在“成本”之后。在
  • 在“前”或“后”括号内没有“其他”序列。在

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

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

不管小数点后(或小数点后)的位数。在

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]')

访问群的方式:

^{pr2}$

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

m = re.match('\[.*?(?P<precost>\d+(?:\.\d*)?).*?\].*?\[.*?(?P<postcost>\d+(?:\.\d*)?).*\]', 'your long string')
m.group('precost')
m.group('postcost')

相关问题 更多 >