正規表現の基本的な書き方

正規表現の基本的な書き方一覧。よく忘れるのでメモとして記載します。

正規表現の書き方マッチする文字
abcabc
abc|aecabc, aec
a(b|e)cabc, aec
a[be]c abc, aec
a[abcde]caac, abc, acc, adc, aec
a[a-e]caac, abc, acc, adc, aec
a[a-cX-Z]caac, abc, acc, aXc, aYc, aZc
abcd?eabce, abcde
abcd+eabcde, abcdde, abcddde, …
abcd*eabce, abcde, abcdde, abcddde, …
a{2}aa
a{2}b{4}aabbbb
a{2,}aa, aaa, aaaa, aaaaa, …
a{2,4}aa, aaa, aaaa
[0-9]0, 1, 2, 3, 4, 5, 6, 7, 8, 9(数値のみ)
[1-36-9]1, 2, 3, 6, 7, 8, 9
\d0, 1, 2, 3, 4, 5, 6, 7, 8, 9(数値のみ)
\D数値以外
[^0-9]数値以外([](カッコ)内先頭の^(キャレット)は否定)
[^\D]数値のみ(数値以外の否定は数値のみ)
0[89]0-\d{4}-\d{4}  携帯番号(080-xxxx-xxxx, 090-xxxx-xxxx)  
^abc行の先頭のabc
abc$行の末尾のabc
^abc$abcだけの行(行の先頭も行の末尾もabc)


正規表現 基本的な書き方解説

上記の内容をざっくり解説します。

abc|aec

“|”(パイプ)で挟むと または(OR) 指定できる。abc, aec にマッチする。

a(b|e)c

“()”(かっこ)内の文字を”|”で挟むと または(OR) 指定できる。abc, aec にマッチする。

a[be]c

“[]”(角かっこ)内の文字を または(OR) 指定できる。角カッコの場合、パイプを挟む必要はない。abc, aec にマッチする。

a[abcde]c

ひとつ上の正規表現の文字数を増やした正規表現。 aac, abc, acc, adc, aec にマッチする。

a[a-e]c

“[]”内でハイフンで文字や数値を指定すると範囲指定できる。上記は、”a” から “e” までの小文字の文字列を指定している。aac, abc, acc, adc, aec にマッチする。

a[a-cX-Z]c

上記正規表現の範囲指定を2つ指定している正規表現。”a” から “c” の小文字、 “X” から “Z” の大文字を指定している。 aac, abc, acc, aXc, aYc, aZc にマッチする。

abcd?e

対象文字の後に、”?”(クエスチョンマーク)を指定すると、 1文字あるまたはなくても、つまり 0回 または 1回 文字があれば、マッチする。上記の場合、dがあってもなくてもマッチするため、 abce, abcde にマッチする。

abcd+e

対象文字の後に、”+”(プラス)を指定すると、対象文字が1文字以上連続してあれば、つまり 1回以上 文字があればマッチする。上記の場合、dが1文字以上あればマッチするため、 abcde, abcdde, abcddde, … にマッチする。

abcd*e

対象文字のあとに、”*”(アスタリスク)を指定すると、対象文字が1文字以上連続してあるまたはなくても、つまり 0回 または 1回以上 文字があればマッチする。上記の場合、abce, abcde, abcdde, abcddde, … にマッチする。

a{2}

対象文字のあとに、”{n}”(波カッコ、nは数字)を指定すると、対象文字が連続してn回ある場合、マッチする。上記の場合、aa にマッチする。

a{2}b{4}

上記の複数指定した正規表現。上記の場合、”a” を 2回、”b” を 4回 なので、aabbbb にマッチする。

a{2,}

対象文字のあとに、”{n,}”を指定すると、対象文字が連続して n回以上 ある場合、マッチする。上記の場合、aa, aaa, aaaa, aaaaa, … にマッチする。

a{2,4}

対象文字のあとに、”{n, m}”を指定すると、対象文字が連続して n回以上 かつ m回以下 ある場合、マッチする。上記の場合、aa, aaa, aaaa にマッチする。

[0-9]

“[]”(角カッコ)の範囲していで、数値を指定した正規表現。”0” から “9” までの数値を指定する。上記の場合、0, 1, 2, 3, 4, 5, 6, 7, 8, 9(数値のみ)にマッチする。

[1-36-9]

上記の範囲指定を複数した正規表現。”1″ から “3” または “6” から “9” の数値にマッチする。上記の場合、1, 2, 3, 6, 7, 8, 9 にマッチする。

\d

数値の場合のみにマッチする。”[0-9]” と同様。上記の場合、0, 1, 2, 3, 4, 5, 6, 7, 8, 9(数値のみ)にマッチする。

\D

数値以外の文字、記号にマッチする。”[^0-9]” や “[^\d]”といった数値の否定と同様。

[^0-9]

“[]”(角カッコ)内の先頭に記載した “^”(キャレット)は否定の正規表現。”[0-9]”で数値を指定し、それを否定する。[^\D]も同様。上記の場合、数値以外にマッチする。

0[89]0-\d{4}-\d{4}

携帯番号(080-xxxx-xxxx, 090-xxxx-xxxx)を指定した正規表現。”080″ または “090” で始まり、”-“(ハイフン)で区切られた数値4桁がある場合、マッチする。

^abc

“^”(キャレットやチルドやハットと呼ぶ)が行の先頭を指定する。上記の場合、行の先頭にある “abc” にマッチする。

abc$

“$”(ドル)が行の末尾を指定する。上記の場合、行の末尾にある “abc” にマッチする。

^abc$

行の先頭と末尾にある “abc” つまり 行に “abc” のみの文字列にマッチする。

Python ディレクトリ配下のファイルの一覧を再帰的に取得する

ディレクトリ直下のファイル一覧、ディレクトリ一覧を3つの方法で取得します。

ディレクトリは以下、ファイルはtxtとlogの2種類です。

ディレクトリ、ファイル構成

sample_dir
  │  
  │  f_01.txt
  │  f_02.log
  │
  ├─d_01
  │      f_01_1.txt
  │      f_01_2.txt
  │      f_01_3.txt
  │
  └─d_02
          f_02_1.log


pathlibで ディレクトリ配下のファイル一覧を取得する

pathlib.Pathを利用して、 拡張子を指定したファイル一覧およびディレクトリとファイル一覧を表示する サンプルコード です。

import pathlib

p = pathlib.Path("sample_dir")

# ディレクトリ配下のテキストファイル一覧を表示(拡張子指定)
for f in p.glob("**/*.txt"):
    print(f)

print()

# ディレクトリ配下のディレクトリ、ファイル一覧を表示
for f in p.glob("**/*"):
    print(f)


# - 結果1
# sample_dir\f_01.txt
# sample_dir\d_01\f_01_1.txt
# sample_dir\d_01\f_01_2.txt
# sample_dir\d_01\f_01_3.txt

# - 結果2
# sample_dir\d_01
# sample_dir\d_02
# sample_dir\f_01.txt
# sample_dir\f_02.log
# sample_dir\d_01\f_01_1.txt
# sample_dir\d_01\f_01_2.txt
# sample_dir\d_01\f_01_3.txt
# sample_dir\d_02\f_02_1.log

pathlib.Path関数にディレクトリのパスを指定します。glob関数で取得するサンプルは相対パスですが、絶対パスも指定可能です。

pathlibの詳細については、公式ドキュメントを参照ください。


globでディレクトリ配下のファイル一覧を取得する

globを利用して、拡張子を指定したファイル一覧およびディレクトリとファイル一覧を表示する サンプルコード です。

import glob

TARGET_DIR = "sample_dir"

# ディレクトリ配下のテキストファイル一覧を表示(拡張子指定)
for f in glob.glob(TARGET_DIR + "/**/*.txt", recursive=True):
    print(f)

print()

# ディレクトリ配下のディレクトリ、ファイル一覧を表示
for f in glob.glob(TARGET_DIR + "/**", recursive=True):
    print(f)


# - 結果1
# sample_dir\f_01.txt
# sample_dir\d_01\f_01_1.txt
# sample_dir\d_01\f_01_2.txt
# sample_dir\d_01\f_01_3.txt

# - 結果2
# sample_dir\
# sample_dir\d_01
# sample_dir\d_01\f_01_1.txt
# sample_dir\d_01\f_01_2.txt
# sample_dir\d_01\f_01_3.txt
# sample_dir\d_02
# sample_dir\d_02\f_02_1.log
# sample_dir\f_01.txt
# sample_dir\f_02.log

glob.glob関数にパスを指定します、再帰的に検索する行うには、「recursive」に「True」を指定します。

globの詳細については、公式ドキュメントを参照ください。


walkでディレクトリ配下のファイル一覧を取得する

os.walkを利用して、拡張子を指定したファイル一覧およびディレクトリとファイル一覧を表示する サンプルコード です。


import os

TARGET_DIR = "sample_dir"

# ディレクトリ配下のテキストファイル一覧を表示
for dir_path, dir_names, file_names in os.walk(TARGET_DIR):
    for file_name in file_names:
        if ".txt" in file_name:
            print(os.path.join(dir_path, file_name))

print()

# ディレクトリ配下のディレクトリ、ファイル一覧を表示
for dir_path, dir_names, file_names in os.walk(TARGET_DIR):
    for dir_name in dir_names:
        print(os.path.join(dir_path, dir_name))
    for file_name in file_names:
        f = os.path.join(dir_path, file_name)
        print(f)


# - 結果1
# sample_dir\f_01.txt
# sample_dir\d_01\f_01_1.txt
# sample_dir\d_01\f_01_2.txt
# sample_dir\d_01\f_01_3.txt

# - 結果2
# sample_dir\d_01
# sample_dir\d_02
# sample_dir\f_01.txt
# sample_dir\f_02.log
# sample_dir\d_01\f_01_1.txt
# sample_dir\d_01\f_01_2.txt
# sample_dir\d_01\f_01_3.txt
# sample_dir\d_02\f_02_1.log


os.walk関数にパスを指定します。これまでと違うのは、os.walkでは、ディレクトリパス、ディレクトリ名、ファイル名の3つの戻り値が返却されます。

os.walkの詳細については、公式ドキュメントを参照ください。

Python 型を確認、チェックする

型の確認方法と型チェックをする記載例です。

Python 型を確認する

type(object)

type(1) -> <class ‘int’>


Python 型をチェックする

isinstance(object, class)

isinstance(1, int) -> True

Python 型を確認、チェックする サンプルコード


# int
i = 1
print(type(i))
print(isinstance(i, int))

# str
s = "a"
print(type(s))
print(isinstance(s, str))

# list
l = ["a", 1]
print(type(l))
print(isinstance(l, list))

# dict
d = {"key": "value"}
print(type(d))
print(isinstance(d, dict))

# tuple
t = (1, 2)
print(type(t))
print(isinstance(t, tuple))

print()

# int check.int or listなら True.
print(isinstance(i, (int, list)))
# str check.int or listなら True.
print(isinstance(s, (int, list)))
# list check.int or listなら True.
print(isinstance(l, (int, list)))
# dict check.int or listなら True.
print(isinstance(d, (int, list)))


# ===== 出力例 =====
# <class 'int'>
# True
# <class 'str'>
# True
# <class 'list'>
# True
# <class 'dict'>
# True
# <class 'tuple'>
# True

# True
# False
# True
# False


Python Printを改行なしにする

print関数のデフォルト設定では、出力文字の末尾に改行コードが設定されます。endパラメータを追加することで、変更できます。

Printを改行なしにする

print(“hoge”, end=””)

end=””(空文字)を設定します

Printの区切り文字をなしにする

print(“foo”, “bar”, sep=””)

sep=””(空文字)を設定します

サンプルコード

# デフォルトは末尾が改行コード
print("line_01")
print("line_02")
# 改行なし
print("line_03", end="")
print("line_04")
# カンマ
print("line_05", end=",")
print("line_06")

print()

# 文字列複数
print("foo", "bar")
# 区切り文字をなし
print("foo", "bar", sep="")

# ===== 出力例 =====
# line_01
# line_02
# line_03line_04
# line_05,line_06

# foo bar
# foobar

PostgreSQL psqlでログインするコマンド パスワード省略(パスワードあり/なし)

よく使うのでメモ。

コマンドラインからpsqlに接続する(パスワードあり)

パターン1

psql “postgresql://{ユーザー名}:{パスワード}@{ホスト名}:{ポート番号}/{データベース名}”

パターン2

psql “user={ユーザー名} password={パスワード} host={ホスト名} port={ポート番号} dbname={データベース名}”


コマンドラインからpsqlに接続する(パスワードなし)

パターン1

psql “postgresql://{ユーザー名}@{ホスト名}:{ポート番号}/{データベース名}”

パターン2

psql “user={ユーザー名} host={ホスト名} port={ポート番号} dbname={データベース名}”

パターン3

psql -U {ユーザー名} -h {ホスト名} -p {ポート番号} -d {データベース名}


psqlからログアウトする

\q