人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: search_it
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● freemann
●10ポイント

Pythonはわからないですが、

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

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

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

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


2 ● きゃづみぃ
●10ポイント

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

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

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


きゃづみぃさんのコメント
検索結果が 0でエラーになってるんじゃないと思う。 ま、解決したんならいいけど。

3 ● a-kuma3
●100ポイント ベストアンサー

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


search_itさんのコメント
助かりました。ご指摘通りでした。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ