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回まで
  • 13歳以上
  • 登録:2012/07/01 17:54:32
  • 終了:2012/07/01 18:26:50

ベストアンサー

id:a-kuma3 No.3

a-kuma3回答回数4412ベストアンサー獲得回数18032012/07/01 18:12:01

ポイント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

freemann回答回数302ベストアンサー獲得回数462012/07/01 18:03:40

ポイント10pt

Pythonはわからないですが、

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

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

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

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

id:taknt No.2

きゃづみぃ回答回数13537ベストアンサー獲得回数11982012/07/01 18:05:50

ポイント10pt

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

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

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

id:taknt

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

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

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

a-kuma3回答回数4412ベストアンサー獲得回数18032012/07/01 18:12:01ここでベストアンサー

ポイント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

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

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません