ほんじゃらねっと

ダイエット中プログラマのブログ

re.finditerで正規表現マッチしたパターン毎にグループ化

分かりにくいタイトルだけど。


1つのファイル内に同じパターンにマッチする箇所が複数ある場合に、
個々の箇所でデータを名前つきグループ化して抽出したい場合に使える。


例えば、HTMLファイルの中からテーブルの各行から個々の列の値を取り出す時とか。


パターンの例

<tr>
<td>(?P<name>.*)</td>
<td>(?P<owner>.*)</td>
<td>(?P<zip>.*)</td>
<td>(?P<address>.*)</td>
<td>(?P<tel>.*)</td>
<td>(?P<fax>.*)</td>
</tr>


コードの例

SOURCE_FILE = "./test_source.html"
PATTERN_FILE = "./test_pattern.html"
OUTPUT_FILE = "./test_output.html"
COLUMNS = [
"name",
"owner",
"zip",
"address",
"tel",
"fax",
]
import re
def main():
pattern_data = open(PATTERN_FILE).read()
source_data = open(SOURCE_FILE).read()
p = re.compile(pattern_data)
f = open(OUTPUT_FILE, "w")
for m in p.finditer(source_data):
if m:
d = m.groupdict()
f.write(",".join([d[name] for name in COLUMNS if d.has_key(name)]))
f.write("\n")
f.close()
print "%s saved." % OUTPUT_FILE
if __name__ == "__main__":
main()