home changes contents help options

042:正規表現にマッチした部分を取り出す

reモジュールのsearch()関数を使います。 正規表現の奥は深いので、記述方法については、 正規表現HowTo とか、 ライブラリリファレンス を見てほしい。

例えば、aで始まる3文字を取り出す場合はこんな感じになる。結果はMatchObject インスタンスというので返ってくるらしいが、何のことだかわからない。とにかくこうすれば取り出せることだけは確か。マッチしないときはNoneになるようだ。

 最初にマッチした部分を取り出す。(aで始める3文字)
 >>> import re
 >>> m=re.search('a..','xxxabcfffpad')
 >>> m.group(0)
 'abc'
 >>> m=re.search('a..','xxx')
 >>> m
 >>> print m
 None

 前がxで、aで始まる3文字を取り出す。
 >>> m=re.search('x(a..)','xxxabcfffpadabc')
 >>> m.group(1)
 'abc'
 >>> m.group(0)
 'xabc'

 マッチした部分を全て取り出すには、findall()を使います。結果はリストで返ってきます。

 >>> m=re.findall('a..','xxxabcfffpadabc')
 >>> m
 ['abc', 'ada']

 指定されたフォルダーの中にあるファイルのリストを取り、特定の形式のものだけをプリントします

 # -*= coding: cp932 -*-
 import sys, re, string, os
 dir='C:\Documents and Settings\seko\My Documents'
 filelist=os.listdir (os.path.normpath(dir))
 for i in filelist:
     try:
         m=re.search('^log-(\d{3})-(\d)-([ABCD])_(\d)\S*',i)
         file=m.group(0)
         print m.group(0),m.group(1),m.group(2),m.group(3),m.group(4)
     except AttributeError:
         continue

>>> log-123-4-B_3xx.txt 123 4 B 3 log-777-4-C_2xxxx.txt 777 4 C 2