Python 正規表現で複数行を置換する

仕事でちょっとしたテキスト処理に正規表現の置換をよく使います。会社では Windows を使っていて Emacs も使いますが普段使いのエディタとしては Mery をメインに使っています。

あるルーティン処理でこれまでは Mery で手動で処理していたものを Python でスクリプトを書いて自動化しようと思い、少し試してみたのですがどうも思ったような動作にならず、試行錯誤していました。結局のところ、フラグの指定など細かいところまでドキュメントを読んでいなかっただけの話で、無事解決できたので記録を残しておきます。

import re

prog = re.compile(r'pattern')
result = prog.sub('replace', 'source')

こういう感じで正規表現をコンパイルして sub メソッドで置換します。

ただ、上記の書き方だと一行ごとでしか検索してくれないのでコンパイル時にフラグを指定する必要がありました。

prog = re.compile(r'pattern', re.MULTILINE)

これでいけるかと思いきや、まだ期待したとおりに動いてくれません。よくよくドキュメントを読むとデフォルトでは . (ドット)は改行文字を含まないので改行文字を含める場合は DOTALL フラグも必要と書いてありました。

prog ...
more ...

Python SQLite3 を操作する(重複チェック)

今考えているプログラムではデータベースにデータを登録する際に、すでに登録されているかどうかをチェックして重複しないように、未登録のデータのみを登録するようにしたいと考えています。

前回作ったデータベースapp_url カラムの値でチェックする場合だと以下の様な関数でチェックできそうです。

# app_url の値をチェックする
def is_exist_url(target):
    sql = 'SELECT app_url FROM apps WHERE app_url ="' + target + '"'
    cur = conn.execute(sql)
    if len(cur.fetchall()):
        return True
    else:
        return False

SQL を組み立てて実行し、その結果を fetchall() したリストの長さを調べます。もしすでに登録されていた場合はデータが入ったリストが返ってきますし、登録がなければ len(結果のリスト)0 になります。

def put_data2(app):
    with conn ...
more ...

Python SQLite3 を操作する(テーブル作成からデータ登録、読み出し)

ファイル形式のデータベース SQLite を Python から触ってみます。Python には標準で sqlite3 というモジュールが付いているので特に何かをインストールする必要はありません。

テーブルの作成

まずテーブルを作ってみます。

import sqlite3

DATABASE = 'sample.db'
conn = sqlite3.connect(DATABASE)

def create_table():
    sql = '''CREATE TABLE IF NOT EXISTS apps
             (id INTEGER PRIMARY KEY,
              app_url TEXT,
              app_name TEXT,
              store_url TEXT)'''
    conn.execute(sql)
    conn.commit()
    # conn.close()

sample.db というファイルでデータベースを作り、 apps ...

more ...

Flask を触ってみる

Python の Web アプリケーション・フレームワークのひとつ、Flask を触ってみました。 Hello World を表示させるサンプルと、Jinja2 テンプレートをつかった HTML 生成を少しやってみます。

ほとんどサンプルコードそのままなので誰かの参考になるようなものではないのですが、自分の備忘のためという意味もこめて。

from flask import Flask
from flask import render_template


app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello World!!"


@app.route('/user/<username>')
def show_user_name(username=''):
    # return "user: " + username
    return render_template('hello.html', name=username ...
more ...

BeautifulSoup で窓の杜ライブラリからソフトウェアのバージョン番号を抜き出す

BeautifulSoup でスクレイピングの練習です。窓の杜ライブラリのページからソフトウェアのバージョン番号のところを抜き出してみます。 窓の杜ライブラリでは以下のような感じでソフトウェアの紹介ページがあり、タイトルなどと一緒に最新のバージョン番号も記載されています。

HTML のソースを見ると以下のようになっていて、 <div class="list-tlt-spec"> を指定して取りに行けばよさそうです。

<div class="list-tlt-spec">
  <h3>Google Chrome</h3>
  <dl>
    <dt class="invisible">バージョン・リリース日</dt>
    <dd>v34.0.1847.131(14/04/24)</dd>
  </dl>
</div>

書いたコードはこういう感じになりました。

import re
from bs4 import BeautifulSoup ...
more ...

Python shelve モジュールで手軽にデータを保存する

Python でちょっとしたデータの保存に使える shelve というモジュールを試してみました。 SQLite などの DB を使うよりも手軽に、それでいてテキストファイルと違って Python のデータオブジェクトをそのまま保存できるのです。リスト型や辞書型などのデータを保存しておいて再利用が可能なのでスクリプト間でのデータの受け渡しにも使えそうですね。

データを保存するサンプルです。リストと現在時刻をそれぞれ myshelve という shelve に保存します。

import datetime
import shelve


def save_data(some_data):
    d = shelve.open('./myshelve')
    d['obj'] = some_data
    # 現在の日時
    today = datetime.datetime.now()
    updated = today.strftime('%Y/%m/%d %a %H:%M:%S')
    d['updated'] = updated ...
more ...

Python から im.kayac.com で Google Talk にメッセージを送る

iPhone や Google Talk(Jabber)へ通知を送信できるサービス im.kayac.com を試してみました。 アクセスには http の POST かメールを用いるのですが、思っていたよりも手軽で特に難しいことはありませんでした。iPhone は使っていないのでやってみたのは Google Talk への通知だけです。

まず im.kayac.com のサイトでユーザー登録をすると自分用のアクセス URL が割り当てられます。Google Talk で api@im.kayac.com というアカウントをコンタクトに加えて自分用の認証コードをメッセージとして送るだけで認証は完了です。

メールを使う場合はアドレス宛てにメールを送るだけですので省略します。POST でのアクセスは Python の場合は以下のように書けば OK でした。

Python 3 の場合は urllib.request を、Python ...

more ...

Python BeautifulSoup でスクレイピングする

Python で html をスクレイピングするためのライブラリは lxml や PyQuery、Scrapy 、BeautifulSoup などいくつかありますが、私は BeautifulSoup を使っています。

バージョンが 3 系と 4 系がありますのでインストール時に注意が必要です。 beautifulsoup4 が 4 系で、 BeautifulSoup が 3 系となります。それさえ間違わないようにすればあとは pip でサクッとインストールするだけですので簡単ですね。

ドキュメントの日本語訳を公開してくださっている方がありますのでこちらを読めばだいたい大丈夫そうです。

今回ちょっとしたスクリプトを書いていて使った部分を書いてみます。

たとえば以下の様な html があるとします(iTunes Store の html を一部改変してます)。

<div ...
more ...