Python

Pythonで正規表現を使って文字列の抽出や置換する方法

By 2021年6月3日No Comments

この記事では、Pythonで正規表現を使って文字列の抽出や置換する方法を解説していきます。

指定した文字列のパターンに一致する文字列を抽出したい場合は正規表現を使うことができます。そして、正規表現を使って文字列を置換するにはsub( )メソッドやsubn( )メソッドを使って正規表現にマッチした文字列と新しい文字列に置換することができます。

Pythonで正規表現を扱うためにはreモジュールをインポートします。

import re

正規表現の特殊文字であるエスケープシーケンスと呼ばれる文字があります。

エスケープシーケンス意味
\A文字列の先頭
\a端末ベル文字
\cXCtrl + X
\n改行コード ASCII行送り(LF)
\r改行コード ASCII復帰(CR)
\fフォームフィード(FF)改ページ
\Rすべての改行コード(「\n\r\n\r」)
\t水平タブ (TAB)
\vASCII 垂直タブ (VT)
\s空白文字(半角スペース、\t、\n、\r、\f)
\S空白文字以外のすべての文字
\d数字。[0-9]
\D数字以外の文字列。[^0-9]
\w半角英数字とアンダースコアのうち任意の一文字。[a-zA-Z0-9_]
\W半角英数字とアンダースコア以外の1文字[^a-zA-Z0-9_]
\Z文字列の末尾
\l半角英小文字のうち1文字
\L半角英小文字の以外の文字1文字(=英大文字、数字、全角文字)
\u半角英大文字のうち1文字
\U半角英大文字以外の1文字(=英小文字、数字、全角文字)
\0NULL文字(
\newline文字列を途中で改行する
\\バックスラッシュ (\)
\’一重引用符 (‘)
\”二重引用符 (“)
\bASCII バックスペース (BS)
\ooo8進数oooを持つASCII文字
\xhh16進数hhを持つASCII文字
\N{name}Unicode データベース中で名前 name を持つ文字
\uxxxx16ビットの16進数値xxxxを持つUnicode文字
\Uxxxxxxxx32ビットの16進数値xxxxxxxxを持つUnicode文字

このようなエスケープシーケンスを使うことができます。エスケープというのは「\」 をつけて特殊な動作を無効にすることができます。

正規表現で使う様々なメタ文字は下記になります。

メタ文字説明
.任意の一文字
^文字列の先頭
$文字列の末尾
*0回以上の繰り返し
+1回以上の繰り返し
?0回または1回
{m}m回の繰り返し
{m,n}m〜n回の繰り返し
  [ ]集合
  ( )グループ化
  |和集合(または)

Pythonで正規表現をこれらのメタ文字やエスケープシーケンスを組み合わせることによってパターン文字列を作ることができます。

Ptyhonで先頭が一致する文字列を抽出することができるmatch( )関数を使う方法

match( )関数で検索対象の文字列の先頭に抽出する文字が存在するかの判定をすることができます。match( )関数の第一引数には抽出する正規表現のパターンを指定して第二引数に検索対象である文字列を指定します。構文は下記になります。

re.match(正規表現のパターン, 対象の文字列)

import re
post = "123-4567"
post_code = re.match('[0-9]{3}-[0-9]{4}', post)
print (post_code)

結果:

<re.Match object; span=(0, 8), match='123-4567'>

上記のサンプルコードは郵便番号のような文字列のパターンを抽出する正規表現になります。{3}を指定して0〜9までの数字3桁で始まり、ハイフン(-)の後に{4}を指定して0~9までの数字4桁で終わる文字列を指定しています。

マッチした部分の文字列はgroup( )メソッドを使うと文字列として取得することができます。

post = "123-4567"
post_code = re.match('[0-9]{3}-[0-9]{4}', post)
print(post_code.group())

結果:

123-4567

このように文字列として抽出することができました。

パターンにマッチした全ての文字列をリスト形式で返すfindall( )関数や文字列中の位置にかかわらずマッチするのsearch( )関数の文字列の抽出方法についてはこちらの記事なります。

Pythonの正規表現を使って文字を置換する方法

sub( )メソッドを使うと対象の文字列の中で正規表現のパターンに一致した文字列を新しい文字列に置換することができます。 構文は下記になります。

re.sub(正規表現のパターン, “置換する文字列”, 置換対象の文字列)

post = '123-4567'
print(re.sub('[1-9]', 'x', post))

結果:

xxx-xxxx

最大置換回数を指定する事もできます。

post = '123-4567'
print(re.sub('[1-9]', 'x', post, 3))

結果:

xxx-4567

複数の文字列を指定して同じ文字列に置換することもできます。

post = '123-4567'
print(re.sub('[1357]', 'x', post))

結果:

x2x-4x6x

「|」で区切っても複数の異なる文字列を同じ文字列に置換する事ができます。

post = '123-4567'
print(re.sub('[123|567]', 'x', post))

結果:

xxx-4xxx

subn( )メソッドを使うと置換処理された文字列と置換した部分の個数を取得することができます。返り値はタプルになります。

post = '123-4567'
post_code = re.subn('[1-9]', 'x', post)
print(type(post_code))
print(post_code[0])
print(post_code[1])

結果:

<class 'tuple'>
xxx-xxxx
7

このようにsub( )メソッドやsubn( )メソッドを使うと様々なパターンで文字列を置換することができます。

まとめ

この記事では、Pythonの正規表現をmatch( )メソッドを使って文字列の抽出やsub( )メソッドやsubn( )メソッドを使って文字列を置換して新しい文字列に置き換える方法について解説しました。このように、正規表現を使うと柔軟な文字列の操作が可能になります。以上、Pythonで正規表現を扱う方法についてでした。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL