Pythonで正規表現

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" でマッチが見つからないためエラーが発生します。
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/07/01 18:26:50
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.3

回答回数4973ベストアンサー獲得回数2154

ポイント100pt

正規表現は、質問の範囲では正しいと思います。
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 メソッドを使うと、期待した動作をすると思います。

id:search_it

助かりました。ご指摘通りでした。

2012/07/01 18:23:02

その他の回答2件)

id:freemann No.1

回答回数335ベストアンサー獲得回数55

ポイント10pt

Pythonはわからないですが、

マッチしないところでは、途中にスペースが入っているので、\Sでは表現できません。

おそらくXXXXというところには:がないと推測されるので、

(?P<field>.+):(?P<value>\b\d{1,3}(,\d{3})*\b)

でうまくいかないでしょうか。

id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント10pt

正規表現で 何を検索しようとしているのかわかりませんが

正規表現の記述の仕方は 間違っているようですね。

?や*の前後にそれを定義する文字が見当たらないようです。

id:taknt

検索結果が 0でエラーになってるんじゃないと思う。

ま、解決したんならいいけど。

2012/07/01 18:29:58
id:a-kuma3 No.3

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント100pt

正規表現は、質問の範囲では正しいと思います。
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 メソッドを使うと、期待した動作をすると思います。

id:search_it

助かりました。ご指摘通りでした。

2012/07/01 18:23:02

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません