正規表現と改行|Pythonの正規表現で改行コードを変換する方法を解説!

正規表現と改行
正規表現を用いると単純な文字列検索以外にも色々な条件をつけて検索することができるようになります。そのため正規表現を用いた置換機能を用いると手作業ではすごく時間が掛かっていた置換処理があっという間に終わってしまうということもよくあります。
改行は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間でテキストファイルのやり取りをすることも増えるかもしれません。そのようなときに活用してみて下さい。
ネプラス株式会社はサービス開始から10年以上
『エンジニアの生涯価値の向上』をミッションに掲げ、
多くのインフラエンジニア・ネットワークエンジニアの就業を支援してきました。
ネプラス株式会社はこんな会社です
秋葉原オフィスにはネプラス株式会社をはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
インフラ業界に特化
ネットワーク・サーバー・データベース等、ITインフラ業界に特化。Cisco Systemsプレミアパートナーをはじめ各種ベンダーのパートナー企業です。
業界を知り尽くしているからこそ大手の取引先企業、経験豊富なエンジニアに選ばれています。
-
正社員なのにフリーランスのような働き方
正社員の方でも希望を聞いたうえでプロジェクトをアサインさせていただいており、フリーランスのような働き方が可能。帰社日もありません。
プロジェクト終了後もすぐに次の案件をご紹介させていただきますのでご安心ください。
-
大手直取引の高額案件
案件のほとんどが大手SIerやエンドユーザーからの直取引のためエンジニアの皆様へに高く還元できています。
Ciscoをはじめ、Juniper、Azure、Linux、AWS等インフラに特化した常時300件以上の案件があります。
-
スキルアップ支援
不要なコストを削減し、その分エンジニアの方へのスキルアップ支援(ネットワーク機器貸出、合格時の受験費用支給など)や給与で還元しています。
受験費用例)CCNP,CCIE:6-20万円、JNCIS:3-4万円、AWS:1-3万円など
※業務に関連する一定の資格のみ。各種条件がありますので詳しくは担当者へにお尋ねください。
-
現給与を保証します!※
前職の給与保証しており、昨年度は100%の方が給与アップを実現。収入面の不安がある方でも安心して入社していただけます。
※適用にはインフラエンジニアの業務経験1年以上、等一定の条件がございます。
-
インセンティブ制度
ネットワーク機器の販売・レンタル事業等、売上に貢献いただいた方にはインセンティブをお支払いしています。
取引先企業とエンジニア側、双方にメリットがあり大変好評をいただいています。
-
社会保険・福利厚生
社員の方は、社会保険を完備。健康保険は業界内で最も評価の高い「関東ITソフトウェア健康保険組合」です。
さらに様々なサービスをお得に利用できるベネフィットステーションにも加入いただきます。
-
東証プライム上場企業グループ
ネプラスは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
ネプラス株式会社に興味を持った方へ
ネプラス株式会社では、インフラエンジニアを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
オンライン面接も随時受付中。ぜひお気軽にご応募ください。

