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

.*最初の一致を欲張りでないものにする必要があります(を追加し?ます)。そうしないと、数字が飲み込まれます。

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