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]"

(3 番目のケースのコロンは意図的なものです)

「プレキャスティングコスト」と「ポストアバターモードコスト」の値を最もよく抽出するにはどうすればよいですか? 正規表現だけでなく 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」の前には常にスペースがあります。
  • 角かっこ内のコロンは1回だけ発生し、常に「コスト」の後に配置されます。
  • 「Pre」または「Post」シーケンスで始まる括弧内の他のグループはありません。
于 2012-10-29T09:25:43.733 に答える
-1

非常に正確なので、間違いなく正規表現です。あなたが話している「プレキャスティングコスト」セクションが表示されません。おそらく「プレアバターモード」のことでしょうか?

しかし、ポスト アバター モードのコストについては、特定のテキストの一貫性を考慮する必要があります。"Post-Avatar Mode Cost: " が常に一貫した区切り文字であることがわかっている場合は、単純な一致を行うことができます。

そこに float 値が必要だと仮定すると、次のようなことができます。

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 に答える