目次
正規表現と改行
正規表現を用いると単純な文字列検索以外にも色々な条件をつけて検索することができるようになります。そのため正規表現を用いた置換機能を用いると手作業ではすごく時間が掛かっていた置換処理があっという間に終わってしまうということもよくあります。
改行はOS毎に使用しているコードが異なります。この機会に覚えましょう。
ここでは、まず「正規表現」と「改行」について簡単に説明します。その後、プログラミング言語Pythonを使ったサンプルプログラムをご紹介します。
正規表現とは?
正規表現とは複数の文字列をひとつのパターンで表現する方法です。
単純な文字列検索の場合、「Windows」という文字列を検索すると完全に一致する文字列だけを検索します。しかし正規表現を用いると「Windows」という文字列以外にも条件を付けて検索することができるようになります。
例えばテキストファイルから「Windows」という文字列を検索する際に「Windows」の後に数字が続く「Windows」のみを検索する場合を考えます。ただし「Windows 10」のように「Windows」と数字の間にある半角スペースは、あってもなくてもよいことにします。
このときの正規表現は下のようになります。「Windows」に続く「¥s*」が0個以上の半角スペースを表していて、続く「¥d+」が1つ以上の数字を表しています
1
|
Windows\s*\d+
|
改行とは?
テキストファイルには改行を示す「改行コード」という特殊な制御文字があります。改行コードはOS毎に異なっています。WindowsではCR+LF、Linux(UNIX)ではLF、macOS9以前のMacintoshではCRが使われています。
CRはキャリッジリターンでASCIIコードは0DH(=13)、LFはラインフィードでASCIIコードは0AH(=10)です。
改行コードと正規表現
正規表現で改行コードを表しますとCRは¥r、LFは¥nとなります。Windowsの場合はCR+LFであることが多いので¥r¥nとなります。
改行コードとマッチする正規表現は以下のようなものが考えられます。?は直前のパターンがあってもなくてもよいことを表す正規表現です。どのような改行コードとマッチさせるかをよく考えて適切なパターンを使いましょう。
1
2
3
4
5
6
|
\r\n #CR+LF
\r?\n #CR+LF または LF のみ
\r\n? #CR+LF または CR のみ
(\r?\n)|(\r\n?) #CR+LF または CR または LF のみ(すべての改行コードにマッチ)
\n #LF
\r #CR
|
Pythonの正規表現で改行コードを変換する
ここではPythonの正規表現を使って改行コードを変換するプログラムを紹介します。
動作確認に使用したPythonのバージョン番号は3.9.1です。Python3で動作させてください。
サンプルプログラム(Sample1.py)はUTF-8のテキストファイル(Sample1.txt)を一括して読み込み、正規表現を用いて改行コードを一括変換し、ファイル(Sample1a.txt)に出力しています。
一括して処理しているため、極端に大きなファイルは処理できない場合があるのでご注意ください。
検索パターンpatと置換文字列(改行コード)aftを適当に換えてどうなるかもご確認ください。
なお、出力されたファイルの改行コードを確認して頂くには改行コードが分かるテキストエディタまたはバイナリファイルエディタを用いるか、サンプルプログラム(Visual.py)をご利用ください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# Sample1.py
# Python 3.9.1で動作確認しました。
# UTF-8ファイルの改行コードを、正規表現を使って検索し、置換します。
# 正規表現モジュールをインポート
import re
# ファイルをバイナリモードでオープン
fr = open('Sample1.txt', 'rb')
fw = open('Sample1a.txt', 'wb')
# 変数初期化
data = ""
# 正規表現
pat = r'(\r?\n)|(\r\n?)' # 改行コード(検索)パターン
aft = r'\n' # 置換後文字列(改行コード)
# ファイル読み込み&bytes型を文字列型に変換
cl = fr.read();
data += cl.decode('utf-8')
# 正規表現を用いて改行コードを変換
after = re.sub(pat, aft, data)
fw.write( after.encode('utf-8') )
# ファイルをクローズ
fw.close()
fr.close()
|
テスト用テキストファイル出力プログラム(Test1.py)
サンプルプログラム(Sample1.py)の入力用テキストファイルを出力するプログラム(Test1.py)です。
data変数に代入している文字列をファイルに出力しているだけのプログラムです。
改行コードを表す記号は正規表現の改行コードと同じ(¥r、¥n)ですので適当に変更してどうなるかを試してみるとよいでしょう。
1
2
3
4
5
6
7
8
9
10
11
12
|
# Test1.py
# Python 3.9.1で動作確認しました。
# 改行コードを換えたUTF-8ファイル(Sample1.txt)を出力します。
# ファイルをバイナリモードでオープン
fw = open('Sample1.txt', 'wb')
data = '東京\r神奈川\n千葉\r\n埼玉\r群馬\n茨木\r\n杤木'
fw.write( data.encode('utf-8') )
# ファイルをクローズ
fw.close()
|
確認用サンプルプログラム(Visual.py)
上のプログラムの改行コード確認用プログラムです。
改行コード(CR、LF)を検出したら[CR]、[LF]の文字列に置き換えて可視化します。改行コードが分かるエディタを用意するのが面倒なときなどにご利用ください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
# Visual.py
# Python 3.9.1で動作確認しました。
# UTF-8ファイルの改行コードを可視化します。
# → 改行コード(CR,LF)を検出したら[CR],[LF]の文字列を追加します。
# → 出力ファイルはSample1b.txtです。
#
# デフォルトで読み込むファイルはSample1.txtです。
# コマンドライン引数に a を指定するとSample1a.txtを読み込み、処理します。
# 例)py Visual.py a
import sys
# 引数によりオープンするファイルを選択
rdfile = 'Sample1.txt'
if sys.argv[1] == 'a':
rdfile = 'Sample1a.txt'
# ファイルをバイナリモードでオープン
fr = open(rdfile, 'rb')
fw = open('Sample1b.txt', 'wb')
# 変数初期化
bd = b''
while True:
c = fr.read(1) # 1文字読み込み
if c == b'\r': # CRのとき
bd += b'[CR]'
c1 = fr.read(1)
if len(c1) != 0: # 読み込みに失敗していなければ
fr.seek(-1,1) # 1文字戻す
if c1 != b'\n': # 次の文字がLFのとき
bd += b'\r\n'
fw.write(bd)
bd = b''
elif c == b'\n': # LFのとき
bd += b'[LF]'
bd += b'\r\n'
fw.write(bd)
bd = b''
else: # 改行コード以外のとき
bd += c
if len(c) == 0: # 読み込みできなかったとき
fw.write(bd)
break
fw.close()
fr.close()
|
まとめ
正規表現と改行について説明しました。プログラミング言語Pythonを用いたサンプルプログラムという形で説明しましたが、正規表現を使えるテキストエディタなどを用いても改行コードの置換を行うことができるものもあります。
テキストエディタ以外にも正規表現を使えるアプリケーションソフトはいろいろありますので是非ご活用ください。
正規表現は使えるようになりますと単純な文字列検索と置換処理ではできないことができるようになって便利です。また改行コードについては知っておくとOS間でテキストファイルのやり取りをするときに思いがけないトラブルにならずに済みます。
Windows 10上ではLinuxが動作するようになりましたので、WindowsとLinux間でテキストファイルのやり取りをすることも増えるかもしれません。そのようなときに活用してみて下さい。
インフラエンジニア専門の転職サイト「FEnetインフラ」
FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。
転職をお考えの方は気軽にご登録・ご相談ください。