Pythonで正規表現で検索を行おうとしておりますが、なかなかうまくいかないのでお助けください。
[file.txt]
breakfast:500
XXXXX pen:200
book:800 XXXXX
XXXXX lunch:1,500 XXXXX
file.txtを1行ずつ以下の正規表現を使って検索を行います。
p = re.compile(r'(?P<field>\S+):(?P<value>\b\d{1,3}(,\d{3})*\b)')
for line in f:
m = p.match(line)
print m.group('field') + ' ' + m.group('value')
最終的に以下のように出力しようとしています。
>> breakfast 500
>> pen 200
>> book 800
>> lunch 1,500
おそらく正規表現の構文に問題があると思います。
2行目の "XXXXX pen:200" でマッチが見つからないためエラーが発生します。
よろしくお願いします。
正規表現は、質問の範囲では正しいと思います。
match メソッドは、行の先頭から正規表現に相当するかどうかを調べる、というのが期待した動作をしない原因だと思います。
http://www.python.jp/doc/2.6/library/re.html#search-vs-match
7.2.6.4. search() vs. match()(原文)
簡単に言えば、 match() は文字列の先頭でのみパターンにマッチしようとします。対して、 search() は文字列のどこででもパターンにマッチしようとします。例えば :>>> re.match("o", "dog") # "o" は文字列 "dog" の最初の文字ではないのでマッチしません >>> re.search("o", "dog") # search() では、文字列のどこであってもマッチする <_sre.SRE_Match object at ...>
match メソッドの代わりに、search メソッドを使うと、期待した動作をすると思います。
Pythonはわからないですが、
マッチしないところでは、途中にスペースが入っているので、\Sでは表現できません。
おそらくXXXXというところには:がないと推測されるので、
(?P<field>.+):(?P<value>\b\d{1,3}(,\d{3})*\b)
でうまくいかないでしょうか。
正規表現で 何を検索しようとしているのかわかりませんが
正規表現の記述の仕方は 間違っているようですね。
?や*の前後にそれを定義する文字が見当たらないようです。
検索結果が 0でエラーになってるんじゃないと思う。
ま、解決したんならいいけど。
正規表現は、質問の範囲では正しいと思います。
match メソッドは、行の先頭から正規表現に相当するかどうかを調べる、というのが期待した動作をしない原因だと思います。
http://www.python.jp/doc/2.6/library/re.html#search-vs-match
7.2.6.4. search() vs. match()(原文)
簡単に言えば、 match() は文字列の先頭でのみパターンにマッチしようとします。対して、 search() は文字列のどこででもパターンにマッチしようとします。例えば :>>> re.match("o", "dog") # "o" は文字列 "dog" の最初の文字ではないのでマッチしません >>> re.search("o", "dog") # search() では、文字列のどこであってもマッチする <_sre.SRE_Match object at ...>
match メソッドの代わりに、search メソッドを使うと、期待した動作をすると思います。
助かりました。ご指摘通りでした。
助かりました。ご指摘通りでした。
2012/07/01 18:23:02