PythonにてHTMLファイルに正規表現を施す時、
エンコーディングやその他諸々の箇所でつかえてしまったので、メモとして残します。
I. HTMLファイルの読み取り
codecs
ライブラリーを使いましょう。Pythonの標準ライブラリなので(Appx. 1)、インストールいらずにimportだけで使用できます。
import codecs
f = codecs.open("hoge.html","r", encoding="utf-8")
注意
- codecs.open関数には必ず
encoding
引数を指定しよう- Windows環境下だと、Shift-JISと明示されたファイル以外はうまく読み取れないそうです。支(つか)えていたところ先人がいました(Appx. 2)。
II.正規表現を施す
re
ライブラリを使いましょう。こちらも標準ライブラリ(Appx. 1)なのでimportのみで使えます。
# (前章のつづき)
import re
str = f.read()
regex = '[abc]'
sample = re.findall(regex, str)
注意
- 前章で読み取ったhtmlファイルを
re
の各関数に渡す際には、事前に必ずcodecs.read()
関数を用いましょう
代表的な正規表現
以下、Appx. 3よりre
の関数として汎用性の高そうなものを列挙します。regex
には正規表現が入るものとします。
- 前方検索:
re.search(regex, string)
- regexパターンがstring内にあるか調べてきて、存在した場合はその文字列(=regex)を返す
- サーチに失敗した場合Noneを返すので、例えば
if not re.search(regex, string):
などで簡単に条件分岐に用いることが出来る
- 全検索:
re.findall(regex, string)
- regexパターンがstring内にあるか調べてきて、一致箇所すべてを含んだリストを返す
- この関数から別のre処理を行いたい時は、(文字列にするために)str関数を用いて文字列化させましょう(Appx. 4)。
- 置換:
re.sub(regex, replace, string, count=0)
- regexパターンがstring内にあるか調べて、replaceに置換する
- countに1以上の自然数を入力すると、stringの前方からregex該当箇所を何回置換するか指定できる。デフォルト値の0だと全箇所置換する
- 「JavaScript等で正規表現を記述する際のグローバルサーチ(
/g
)ってPythonでどうやって表現するのかな?」と思っていたのですが、どうやらこのcount=0の状態で表現されているようです(Appx. 5)
- 「JavaScript等で正規表現を記述する際のグローバルサーチ(
なお、正規表現そのものについてはAppx. 6に詳しいです。
(以上)
参考 (Appendix / Appx.)
- 1. Python 標準ライブラリ
- 2. WindowsでCP932(Shift-JIS)エンコード以外のファイルを開くのに苦労した話
- 3. re --- 正規表現操作
- 4. re.sub erroring with “Expected string or bytes-like object”
- 5. Python RegExp global flag
- 6. 基本的な正規表現一覧
- 正規表現を調べるのにいつも使用させていただいております。