工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Python

Python正規表現(reモジュール)実践ガイド

Python正規表現(reモジュール)実践ガイド

Pythonのreモジュールで正規表現の力を活用する方法を発見。ステップバイステップ例で一般的パターン、マッチング技法、高度関数を解説。

正規表現とは?

正規表現(RegEx)は検索パターンを定義する文字シーケンスです。例えばパターン^a...s$はaで始まりsで終わる5文字文字列にマッチします。

^a...s$

パターンは文字列照合に使用できます。以下の表は異なる入力に対するパターン振る舞いを示します:

式文字列マッチ?
^a...s$absマッチなし
aliasマッチ
abyssマッチ
Aliasマッチなし
An abacusマッチなし

PythonのreモジュールはRegEx操作に必要なツールを提供。re.match()でパターンを文字列照合する簡単な例:

import re
pattern = '^a...s$'
test_string = 'abyss'
result = re.match(pattern, test_string)
if result:
    print("Search successful.")
else:
    print("Search unsuccessful.")

パターン発見時、re.match()はマッチオブジェクト返却;否则None。

メタ文字によるパターン指定

メタ文字は正規表現エンジンが特別な意味で解釈する特殊記号。主要メタ文字のクイックリファレンス:

[] . ^ $ * + ? {} () \ |

角括弧:[]

角括弧はマッチ対象文字セットを定義。例:[abc]はa、b、cのいずれか1文字にマッチ。

式文字列マッチ?
[abc]a1マッチ
ac2マッチ
Hey Judeマッチなし
abc de ca5マッチ

ハイフンで範囲指定可能、例:[a-e]は[abcde]と等価。セット反転は開き括弧直後にキャレット^、例:[^abc]はa、b、c以外の任意文字にマッチ。

ピリオド:.

ドットは改行以外の任意単一文字にマッチ。

式文字列マッチ?
..aマッチなし
ac1マッチ
acd1マッチ
acde2マッチ(4文字含む)

キャレット:^とドル:$

キャレットは文字列先頭、ドルは文字列末尾をアサート。例:^aはaで始まる文字列、a$はaで終わる文字列にマッチ。

式文字列マッチ?
^aa1マッチ
abc1マッチ
bacマッチなし
^ababc1マッチ
acbマッチなし(aで始まるがbが続かない)
式文字列マッチ?
a$a1マッチ
formula1マッチ
cabマッチなし

量指定子:*、+、?、{n,m}

これら記号は直前要素の出現回数を制御。

例:

式文字列マッチ?
ma*nmn1マッチ
man1マッチ
maaan1マッチ
mainマッチなし(aがnに続かない)
woman1マッチ
式文字列マッチ?
ma+nmnマッチなし(aなし)
man1マッチ
maaan1マッチ
mainマッチなし(aがnに続かない)
woman1マッチ
式文字列マッチ?
ma?nmn1マッチ
man1マッチ
maaanマッチなし(aが1超)
mainマッチなし(aがnに続かない)
woman1マッチ
式文字列マッチ?
a{2,3}abc datマッチなし
abc daat1マッチ(daatで)
aabc daaat2マッチ(aabcとdaaatで)
aabc daaaat2マッチ(aabcとdaaaatで)

よく使われるパターン:[0-9]{2,4}は2〜4桁連続数字にマッチ。

式文字列マッチ?
[0-9]{2,4}ab123csde1マッチ(ab123csdeで)
12 and 3456733マッチ(12、3456、73)
1 and 2マッチなし

選択:|

垂直バーは論理OR実装。例:a|bはaまたはbを含む文字列にマッチ。

式文字列マッチ?
a|bcdeマッチなし
ade1マッチ(adeで)
acdbea3マッチ(acdbeaで)

グループ化:()

括弧でサブパターンをグループ化し、マッチ部分文字列を捕捉。例:(a|b|c)xzはa、b、cのいずれかにxzが続く文字列にマッチ。

式文字列マッチ?
(a|b|c)xzab xzマッチなし
abxz1マッチ(abxzで)
axz cabxz2マッチ(axzbc cabxzで)

エスケープ:\

バックスラッシュでメタ文字をリテラル扱い。例:\$aは$を行末アンカーと解釈せずリテラル$aシーケンスにマッチ。

特殊シーケンス

特殊シーケンスは一般的パターンを簡素化。以下はリファレンスリストと例示例。

文字列先頭:\A

式文字列マッチ?
\Athethe sunマッチ
In the sunマッチなし

単語境界:\b

式文字列マッチ?
\bfoofootballマッチ
a footballマッチ
afootballマッチなし
foo\bthe fooマッチ
the afoo testマッチ
the afootestマッチなし

非単語境界:\B

式文字列マッチ?
\Bfoofootballマッチなし
a footballマッチなし
afootballマッチ
foo\Bthe fooマッチなし
the afoo testマッチなし
the afootestマッチ

数字:\d / 非数字:\D

式文字列マッチ?
\d12abc33マッチ(12abc3で)
Pythonマッチなし
\D1ab34"503マッチ(1ab34"50で)
1345マッチなし

空白:\s / 非空白:\S

式文字列マッチ?
\sPython RegEx1マッチ
PythonRegExマッチなし
\Sa b2マッチ( a bで)
マッチなし

単語文字:\w / 非単語:\W

式文字列マッチ?
\w12&": ;c 3マッチ(12": ;cで)
"%> !マッチなし
\W1a2%c1マッチ(1a2%cで)
Pythonマッチなし

文字列末尾:\Z

式文字列マッチ?
Python\ZI like Python1マッチ
I like Python Programmingマッチなし
Python is fun.マッチなし

ヒント: regex101のようなオンライン正規表現テスターでパターンを素早く作成・デバッグ。

PythonでのRegEx使用

Pythonのreモジュールは正規表現操作のための豊富な関数と定数を提供。インポート:

import re

以下は最も一般的なユーティリティと使用法。

re.findall()

文字列内のすべての非重複マッチをリスト返却。

# 文字列からすべての数字抽出
import re
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
result = re.findall(pattern, string)
print(result)  # 出力: ['12', '89', '34']

マッチなし時は空リスト返却。

re.split()

パターンマッチ箇所で文字列分割、部分文字列リスト返却。

import re
string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'
result = re.split(pattern, string)
print(result)  # 出力: ['Twelve:', ' Eighty nine:', '.']

オプションmaxsplitで分割数制限可能。0(デフォルト)は全マッチで分割。

import re
string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'
# 最初の出現のみで分割
result = re.split(pattern, string, 1)
print(result)  # 出力: ['Twelve:', ' Eighty nine:89 Nine:9.']

re.sub()

パターンのすべての出現を置換文字列で置換。

# すべての空白文字削除
import re
string = 'abc 12\nde 23 \n f45 6'
pattern = '\s+'
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string)  # 出力: abc12de23f456

置換数制限はcount引数。0で全マッチ置換。

new_string = re.sub(r'\s+', replace, string, 1)
print(new_string)  # 出力:
# abc12de 23
# f45 6

re.subn()

re.sub()類似だが、新文字列と置換実行回数のタプル返却。

new_string = re.subn(pattern, replace, string)
print(new_string)  # 出力: ('abc12de23f456', 4)

re.search()

パターンマッチ最初の位置を検索。

string = "Python is fun"
match = re.search('\\APython', string)
if match:
    print("pattern found inside the string")
else:
    print("pattern not found")
# 出力: pattern found inside the string

マッチオブジェクト

マッチ発見時、re.search()はMatchオブジェクト返却。主なメソッド/属性:

string = '39801 356, 2102 1111'
pattern = '(\\d{3}) (\\d{2})'
match = re.search(pattern, string)
if match:
    print(match.group())
    print(match.group(1))
    print(match.group(2))
    print(match.groups())
    print(match.start(), match.end(), match.span())
else:
    print("pattern not found")
# 出力:
# 801 35
# 801
# 35
# ('801', '35')
# 2 8 (2, 8)

Raw文字列使用(プレフィックスr)

文字列リテラルにrプレフィックスでバックスラッシュをリテラル扱い、意図せぬエスケープシーケンス防止。正規表現パターンで特に有用。

string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string)
print(result)  # 出力: ['\n', '\r']

reモジュールの更なる探求は公式Pythonドキュメントを参照。

Python

  1. Python キーワードと識別子: 予約語と命名規則をマスター
  2. Python データ型マスター: 実践ガイド
  3. Python 演算子完全マスター: 包括的ガイド
  4. Python pass文完全マスター: 実践ガイド
  5. Python 関数引数完全マスター: 位置引数・キーワード引数・デフォルト引数
  6. Python辞書完全ガイド:作成、操作、高度なテクニック
  7. Pythonイテレータ完全ガイド:仕組みと自作方法
  8. Pythonクロージャ解説:ネスト関数が変数を捕捉する仕組み
  9. Python datetimeマスター:日付・時刻・タイムゾーン実践ガイド
  10. Pythonのtimeモジュールをマスター:関数、構造体、実践例
  11. Pythonのtime.sleep()をマスター:ベストプラクティス、マルチスレッド、実例