Python3-正規表現

正規表現は、あなたが一致するかのパターンで開催された、特殊な構文を使用して他の文字列または文字列のセットを、見つけることができます文字の特別なシーケンスです。正規表現はUNIXの世界で広く使用されています。

モジュール rePythonでPerlのような正規表現を完全にサポートします。ザ・re モジュールは例外を発生させます re.error 正規表現のコンパイルまたは使用中にエラーが発生した場合。

正規表現を処理するために使用される2つの重要な関数について説明します。それでも、最初に小さなことがあります。正規表現で使用すると特別な意味を持つさまざまな文字があります。正規表現を処理する際の混乱を避けるために、RawStringsを次のように使用します。r'expression'

単一文字に一致する基本パターン

シニア番号 式と一致
1

a, X, 9, <

普通のキャラクターは自分にぴったり合っています。

2

. (a period)

改行を除くすべての単一文字に一致します '\ n'

3

\w

「単語」文字に一致します:文字または数字またはアンダーバー[a-zA-Z0-9_]。

4

\W

単語以外の文字と一致します。

5

\b

単語と非単語の境界

6

\s

単一の空白文字(スペース、改行、リターン、タブ)に一致します

7

\S

空白以外の文字と一致します。

8

\t, \n, \r

タブ、改行、戻る

9

\d

10進数[0-9]

10

^

文字列の先頭に一致します

11

$

文字列の終わりに一致する

12

\

キャラクターの「特殊性」を抑制します。

コンパイルフラグ

コンパイルフラグを使用すると、正規表現の動作のいくつかの側面を変更できます。フラグは、reモジュールで2つの名前(次のような長い名前)で使用できます。IGNORECASE そして、Iのような短い1文字のフォーム。

シニア番号 フラグと意味
1

ASCII, A

\ w、\ b、\ s、\ dのようないくつかのエスケープを、それぞれのプロパティを持つASCII文字でのみ一致させます。

2

DOTALL, S

改行を含む任意の文字を作成し、一致させます

3

IGNORECASE, I

大文字と小文字を区別しない一致を行う

4

LOCALE, L

ロケールを意識した照合を行う

5

MULTILINE, M

^と$に影響する複数行のマッチング

6

VERBOSE, X (for ‘extended’)

よりクリーンで理解しやすい方法で整理できる詳細なREを有効にする

マッチ機能

この関数は、オプションのフラグを使用してREパターン文字列に一致させようとします。

この関数の構文は次のとおりです-

re.match(pattern, string, flags = 0)

パラメータの説明は次のとおりです-

シニア番号 パラメータと説明
1

pattern

これは、照合される正規表現です。

2

string

これは文字列であり、文字列の先頭のパターンに一致するように検索されます。

3

flags

ビットごとのOR(|)を使用して、さまざまなフラグを指定できます。これらは修飾子であり、以下の表にリストされています。

re.match関数が返すのAmatch 成功の反対、 None失敗したとき。group(num)またはgroups()関数を使用しますmatch 一致する式を取得するオブジェクト。

シニア番号 一致オブジェクトのメソッドと説明
1

group(num = 0)

このメソッドは、一致全体(または特定のサブグループ番号)を返します

2

groups()

このメソッドは、タプル内の一致するすべてのサブグループを返します(存在しない場合は空)

#!/usr/bin/python3
import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print ("matchObj.group() : ", matchObj.group())
   print ("matchObj.group(1) : ", matchObj.group(1))
   print ("matchObj.group(2) : ", matchObj.group(2))
else:
   print ("No match!!")

上記のコードを実行すると、次の結果が得られます。

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

検索機能

この関数は、オプションのフラグを使用して、文字列内で最初に出現するREパターン検索します。

この関数の構文は次のとおりです-

re.search(pattern, string, flags = 0)

パラメータの説明は次のとおりです-

シニア番号 パラメータと説明
1

pattern

これは、照合される正規表現です。

2

string

これは文字列であり、文字列内の任意の場所のパターンに一致するように検索されます。

3

flags

ビットごとのOR(|)を使用して、さまざまなフラグを指定できます。これらは修飾子であり、以下の表にリストされています。

re.search関数が返すのAmatch 成功の反対、 none失敗したとき。group(num)またはgroups()関数を使用しますmatch 一致した式を取得するオブジェクト。

シニア番号 一致オブジェクトのメソッドと説明
1

group(num = 0)

このメソッドは、一致全体(または特定のサブグループ番号)を返します

2

groups()

このメソッドは、タプル内の一致するすべてのサブグループを返します(存在しない場合は空)

#!/usr/bin/python3
import re

line = "Cats are smarter than dogs";

searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)

if searchObj:
   print ("searchObj.group() : ", searchObj.group())
   print ("searchObj.group(1) : ", searchObj.group(1))
   print ("searchObj.group(2) : ", searchObj.group(2))
else:
   print ("Nothing found!!")

上記のコードを実行すると、次の結果が得られます。

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

マッチングと検索

Pythonは、正規表現に基づいて2つの異なるプリミティブ操作を提供します。 match 文字列の先頭でのみ一致をチェックしますが、 search 文字列内の任意の場所で一致するかどうかをチェックします(これはPerlがデフォルトで行うことです)。

#!/usr/bin/python3
import re

line = "Cats are smarter than dogs";

matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print ("match --> matchObj.group() : ", matchObj.group())
else:
   print ("No match!!")

searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
   print ("search --> searchObj.group() : ", searchObj.group())
else:
   print ("Nothing found!!")

上記のコードを実行すると、次の結果が得られます。

No match!!
search --> matchObj.group() :  dogs

検索と置換

最も重要なものの1つ re 正規表現を使用するメソッドは sub

構文

re.sub(pattern, repl, string, max=0)

このメソッドは、文字列内のREパターンのすべてのオカレンスをreplに置き換え、maxが指定されていない限りすべてのオカレンスを置き換えます。このメソッドは、変更された文字列を返します。

#!/usr/bin/python3
import re

phone = "2004-959-559 # This is Phone Number"

# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print ("Phone Num : ", num)

# Remove anything other than digits
num = re.sub(r'\D', "", phone)    
print ("Phone Num : ", num)

上記のコードを実行すると、次の結果が得られます。

Phone Num :  2004-959-559
Phone Num :  2004959559

正規表現修飾子:オプションフラグ

正規表現リテラルには、マッチングのさまざまな側面を制御するためのオプションの修飾子が含まれる場合があります。修飾子はオプションのフラグとして指定されます。前に示したように、排他的論理和(|)を使用して複数の修飾子を指定でき、これらのいずれかで表すことができます。

シニア番号 修飾子と説明
1

re.I

大文字と小文字を区別しないマッチングを実行します。

2

re.L

現在のロケールに従って単語を解釈します。この解釈は、アルファベットのグループ(\ wと\ W)、および単語の境界の動作(\ bと\ B)に影響します。

3

re.M

$を(文字列の終わりだけでなく)行の終わりに一致させ、^を(文字列の始まりだけでなく)任意の行の始まりに一致させます。

4

re.S

ピリオド(ドット)を改行を含む任意の文字と一致させます。

5

re.U

Unicode文字セットに従って文字を解釈します。このフラグは、\ w、\ W、\ b、\ Bの動作に影響します。

6

re.X

「よりかわいい」正規表現構文を許可します。空白を無視し(セット[]内、または円記号でエスケープされている場合を除く)、エスケープされていない#をコメントマーカーとして扱います。

正規表現パターン

制御文字を除いて、 (+ ? . * ^ $ ( ) [ ] { } | \)、すべての文字が一致します。制御文字の前に円記号を付けると、制御文字をエスケープできます。

次の表に、Pythonで使用できる正規表現の構文を示します。

シニア番号 パラメータと説明
1

^

行頭に一致します。

2

$

行末に一致します。

3

.

改行以外の任意の1文字に一致します。mオプションを使用すると、改行にも一致させることができます。

4

[...]

角かっこ内の任意の1文字に一致します。

5

[^...]

角かっこで囲まれていない任意の1文字に一致します

6

re*

先行する式の0回以上の出現に一致します。

7

re+

前の式の1つ以上のオカレンスに一致します。

8

re?

前の式の0または1回の出現に一致します。

9

re{ n}

先行する式のn回の出現に正確に一致します。

10

re{ n,}

先行する式のn回以上の出現に一致します。

11

re{ n, m}

先行する式の少なくともn回および最大m回の出現に一致します。

12

a|b

aまたはbのいずれかに一致します。

13

(re)

正規表現をグループ化し、一致したテキストを記憶します。

14

(?imx)

正規表現内のi、m、またはxオプションを一時的にオンに切り替えます。括弧内の場合、その領域のみが影響を受けます。

15

(?-imx)

正規表現内のi、m、またはxオプションを一時的にオフに切り替えます。括弧内の場合、その領域のみが影響を受けます。

16

(?: re)

一致したテキストを記憶せずに正規表現をグループ化します。

17

(?imx: re)

括弧内のi、m、またはxオプションを一時的にオンに切り替えます。

18

(?-imx: re)

括弧内のi、m、またはxオプションを一時的にオフに切り替えます。

19

(?#...)

コメント。

20

(?= re)

パターンを使用して位置を指定します。範囲はありません。

21

(?! re)

パターン否定を使用して位置を指定します。範囲はありません。

22

(?> re)

バックトラックなしで独立したパターンに一致します。

23

\w

単語の文字に一致します。

24

\W

単語以外の文字に一致します。

25

\s

空白に一致します。[\ t \ n \ r \ f]と同等です。

26

\S

非空白に一致します。

27

\d

数字と一致します。[0-9]に相当します。

28

\D

数字以外に一致します。

29

\A

文字列の先頭に一致します。

30

\Z

文字列の終わりに一致します。改行が存在する場合は、改行の直前と一致します。

31

\z

文字列の終わりに一致します。

32

\G

最後の試合が終了した試合ポイント。

33

\b

角かっこで囲まれていない場合、単語の境界に一致します。角かっこ内の場合、バックスペース(0x08)に一致します。

34

\B

単語以外の境界に一致します。

35

\n, \t, etc.

改行、キャリッジリターン、タブなどに一致します。

36

\1...\9

n番目のグループ化された部分式に一致します。

37

\10

すでに一致している場合は、n番目のグループ化された部分式に一致します。それ以外の場合は、文字コードの8進表現を指します。

正規表現の例

リテラル文字

シニア番号 例と説明
1

python

「python」に一致します。

キャラクタークラス

シニア番号 例と説明
1

[Pp]ython

「Python」または「python」に一致

2

rub[ye]

「ruby」または「rube」に一致

3

[aeiou]

任意の1つの小文字の母音に一致します

4

[0-9]

任意の数字に一致します。[0123456789]と同じ

5

[a-z]

任意の小文字のASCII文字に一致します

6

[A-Z]

任意の大文字のASCII文字に一致します

7

[a-zA-Z0-9]

上記のいずれかに一致する

8

[^aeiou]

小文字の母音以外に一致する

9

[^0-9]

数字以外のものと一致する

特殊文字クラス

シニア番号 例と説明
1

.

改行以外の任意の文字に一致します

2

\d

数字に一致:[0-9]

3

\D

数字以外に一致する:[^ 0-9]

4

\s

空白文字に一致します:[\ t \ r \ n \ f]

5

\S

非空白に一致:[^ \ t \ r \ n \ f]

6

\w

1つの単語の文字に一致します:[A-Za-z0-9_]

7

\W

単語以外の文字に一致する:[^ A-Za-z0-9_]

繰り返しの場合

シニア番号 例と説明
1

ruby?

「rub」または「ruby」に一致:yはオプションです

2

ruby*

「摩擦」に0以上のysを加えたものに一致する

3

ruby+

「摩擦」と1つ以上のysを一致させる

4

\d{3}

正確に3桁一致

5

\d{3,}

3桁以上一致する

6

\d{3,5}

3、4、または5桁に一致

貪欲でない繰り返し

これは最小の繰り返し数に一致します-

シニア番号 例と説明
1

<.*>

貪欲な繰り返し:「<python> perl>」に一致

2

<.*?>

貪欲でない:「<python> perl>」の「<python>」に一致します

括弧でグループ化

シニア番号 例と説明
1

\D\d+

グループなし:+繰り返し\ d

2

(\D\d)+

グループ化:+ \ D \ dペアを繰り返す

3

([Pp]ython(,)?)+

「Python」、「Python、python、python」などに一致します。

後方参照

これは、以前に一致したグループと再び一致します-

シニア番号 例と説明
1

([Pp])ython&\1ails

python&pailsまたはPython&Pailsに一致します

2

(['"])[^\1]*\1

一重引用符または二重引用符で囲まれた文字列。\ 1は、最初のグループが一致したものに一致します。\ 2は、2番目のグループが一致したものに一致します。

代替案

シニア番号 例と説明
1

python|perl

「python」または「perl」に一致

2

rub(y|le)

「ルビー」または「ルーブル」に一致

3

Python(!+|\?)

「Python」の後に1つ以上!または1つ?

アンカー

これは一致位置を指定する必要があります。

シニア番号 例と説明
1

^Python

文字列または内部行の先頭で「Python」と一致します

2

Python$

文字列または行の末尾にある「Python」と一致する

3

\APython

文字列の先頭で「Python」と一致する

4

Python\Z

文字列の最後にある「Python」と一致する

5

\bPython\b

単語の境界で「Python」と一致する

6

\brub\B

\ Bは単語以外の境界です:「rube」と「ruby」の「rub」に一致しますが、単独では一致しません

7

Python(?=!)

感嘆符が続く場合は、「Python」と一致します。

8

Python(?!!)

感嘆符が続かない場合は、「Python」と一致します。

括弧付きの特別な構文

シニア番号 例と説明
1

R(?#comment)

「R」に一致します。残りはすべてコメントです

2

R(?i)uby

「uby」との照合では大文字と小文字を区別しない

3

R(?i:uby)

同上

4

rub(?:y|le))

\ 1後方参照を作成せずにグループ化のみ