Python正規表現
Python 正規表現
このチュートリアルでは、正規表現 (RegEx) について学び、Python の re モジュールを使用して (例を使用して) RegEx を操作します。
登録 ular 例 pression (RegEx) は、検索パターンを定義する一連の文字です。たとえば、
^a...s$ 上記のコードは RegEx パターンを定義しています。パターンは次のとおりです:a で始まる任意の 5 文字の文字列 s で終わる .
RegEx を使用して定義されたパターンは、文字列との照合に使用できます。
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
^a...s$ | abs | 一致しません |
alias | マッチ | |
abyss | マッチ | |
Alias | 一致しません | |
An abacus | 一致しません |
Python には re という名前のモジュールがあります 正規表現で動作します。以下に例を示します:
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() を使用しました パターンを検索する関数 test_string 内 .検索が成功した場合、このメソッドは一致オブジェクトを返します。そうでない場合は、None を返します。 .
re には他にもいくつかの関数が定義されています。 正規表現で動作するモジュール。それを調べる前に、正規表現自体について学びましょう。
正規表現の基本を既に知っている場合は、Python 正規表現にジャンプしてください。
正規表現を使用してパターンを指定
正規表現を指定するには、メタ文字を使用します。上の例では ^ と $
メタキャラクター
メタ文字は、正規表現エンジンによって特別な方法で解釈される文字です。メタ文字のリストは次のとおりです:
[] . ^ $ * + ? {} () \ |
[] - 角かっこ
角括弧は、一致させたい文字のセットを指定します。
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
[abc] | a | 1試合 |
ac | 2試合 | |
Hey Jude | 一致しません | |
abc de ca | 5試合 |
ここでは、[abc] 一致させようとしている文字列に a のいずれかが含まれている場合に一致します 、 b または c .
- を使用して文字の範囲を指定することもできます 角括弧内。
[a-e][abcde]と同じです .[1-4][1234]と同じです .[0-39][01239]と同じです .
キャレット ^ を使用して文字セットを補完 (反転) できます 角括弧の先頭の記号。
[^abc]a 以外の任意の文字を意味します または b または c .[^0-9]数字以外の文字を意味します。
. - 期間
ピリオドは任意の 1 文字と一致します (改行 '\n' を除く) ).
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
.. | a | 一致しません |
ac | 1試合 | |
acd | 1試合 | |
acde | 2 つの一致 (4 文字を含む) |
^ - キャレット
キャレット記号 ^ 文字列がで始まるかどうかを確認するために使用されます
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
^a | a | 1試合 |
abc | 1試合 | |
bac | 一致しません | |
^ab | abc | 1試合 |
acb | 一致なし (a で始まる) b が続かない ) |
$ - ドル
ドル記号 $ 文字列が で終わるかどうかを確認するために使用されます
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
a$ | a | 1試合 |
formula | 1試合 | |
cab | 一致しません |
* - スター
スター記号 * 0 回以上の出現に一致
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
ma*n | mn | 1試合 |
man | 1試合 | |
maaan | 1試合 | |
main | 一致しません (a n が続かない ) | |
woman | 1試合 |
+ - プラス
プラス記号 + 1 つ以上の出現に一致
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
ma+n | mn | 一致なし (a なし) 文字) |
man | 1試合 | |
maaan | 1試合 | |
main | 一致しません (a の後に n が続きません) | |
woman | 1試合 |
? - 疑問符
疑問符記号 ? 0 回または 1 回の出現に一致
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
ma?n | mn | 1試合 |
man | 1試合 | |
maaan | 一致なし (複数の a 文字) | |
main | 一致しません (a の後に n が続きません) | |
woman | 1試合 |
{} - ブレース
次のコードを検討してください:{n,m} .これは少なくとも n を意味します 、最大 m それに残されたパターンの繰り返し。
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
a{2,3} | abc dat | 一致しません |
abc daat | 1 件の一致 (daat で) ) | |
aabc daaat | 2 件の一致 (aabc で) と daaat ) | |
aabc daaaat | 2 一致 (aabc) と daaaat ) |
もう 1 つの例を試してみましょう。この正規表現 [0-9]{2, 4} 2桁以上4桁以内
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
[0-9]{2,4} | ab123csde | 1 件一致 (ab123csde で一致) ) |
12 and 345673 | 3 一致 (12 、 3456 、 73 ) | |
1 and 2 | 一致しません |
| - 交代
縦棒 | 交互に使用されます (or オペレーター)
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
a|b | cde | 一致しません |
ade | 1 マッチ (ade でマッチ) ) | |
acdbea | 3 一致 (acdbea) ) |
ここでは、a|b a のいずれかを含む任意の文字列に一致します または b
() - グループ
括弧 () サブパターンをグループ化するために使用されます。例:(a|b|c)xz a のいずれかに一致する任意の文字列に一致します または b または c 続いて xz
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
(a|b|c)xz | ab xz | 一致しません |
abxz | 1 件一致 (abxz で一致) ) | |
axz cabxz | 2 件の一致 (axzbc cabxz) ) |
\ - バックスラッシュ
バックラッシュ \ すべてのメタ文字を含むさまざまな文字をエスケープするために使用されます。たとえば、
\$a 文字列に $ が含まれている場合に一致 続いて a .ここでは、$ 正規表現エンジンによって特別な方法で解釈されることはありません。
文字に特別な意味があるかどうかわからない場合は、 \ を入力できます その前に。これにより、キャラクターが特別に扱われることがなくなります。
スペシャル シーケンス
特殊なシーケンスにより、一般的に使用されるパターンを簡単に記述できます。特別なシーケンスのリストは次のとおりです:
\A - 指定された文字が文字列の先頭にある場合に一致します。
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
\Athe | the sun | マッチ |
In the sun | 一致しません |
\b - 指定された文字が単語の先頭または末尾にあるかどうかに一致します。
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
\bfoo | football | マッチ |
a football | マッチ | |
afootball | 一致しません | |
foo\b | the foo | マッチ |
the afoo test | マッチ | |
the afootest | 一致しません |
\B - \b の反対 .指定された文字がそうでない場合に一致します 単語の最初または最後に。
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
\Bfoo | football | 一致しません |
a football | 一致しません | |
afootball | マッチ | |
foo\B | the foo | 一致しません |
the afoo test | 一致しません | |
the afootest | マッチ |
\d - 任意の 10 進数に一致します。 [0-9] に相当
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
\d | 12abc3 | 3 一致 (12abc3) ) |
Python | 一致しません |
\D - 10 進数以外の任意の数字に一致します。 [^0-9] に相当
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
\D | 1ab34"50 | 3 一致 (1ab34"50) ) |
1345 | 一致しません |
\s - 文字列に空白文字が含まれている場所に一致します。 [ \t\n\r\f\v] に相当 .
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
\s | Python RegEx | 1試合 |
PythonRegEx | 一致しません |
\S - 文字列に空白以外の文字が含まれている場所に一致します。 [^ \t\n\r\f\v] に相当 .
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
\S | a b | 2 件の一致 ( a b) ) |
| 一致しません |
\w - 任意の英数字 (数字とアルファベット) に一致します。 [a-zA-Z0-9_] に相当 .ちなみに、アンダースコア _ も英数字と見なされます。
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
\w | 12&": ;c | 3 一致 (12&": ;c) ) |
%"> ! | 一致しません |
\W - 英数字以外の文字と一致します。 [^a-zA-Z0-9_] に相当
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
\W | 1a2%c | 1 試合 (1a2%c) ) |
Python | 一致しません |
\Z - 指定された文字が文字列の末尾にある場合に一致します。
| 式 | 文字列 | 一致しましたか? |
|---|---|---|
Python\Z | I like Python | 1試合 |
I like Python Programming | 一致しません | |
Python is fun. | 一致しません |
ヒント: 正規表現を作成してテストするには、regex101 などの RegEx テスター ツールを使用できます。このツールは、正規表現の作成に役立つだけでなく、学習にも役立ちます。
RegEx の基本を理解したところで、Python コードで RegEx を使用する方法について説明しましょう。
Python 正規表現
Python には re という名前のモジュールがあります 正規表現を操作する。これを使用するには、モジュールをインポートする必要があります。
import re このモジュールは、RegEx で動作するいくつかの関数と定数を定義します。
re.findall()
re.findall() メソッドは、すべての一致を含む文字列のリストを返します。
例 1:re.findall()
# Program to extract numbers from a string
import re
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
result = re.findall(pattern, string)
print(result)
# Output: ['12', '89', '34']
パターンが見つからない場合、re.findall() 空のリストを返します。
re.split()
re.split メソッドは、一致する文字列を分割し、分割が発生した文字列のリストを返します。
例 2:re.split()
import re
string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'
result = re.split(pattern, string)
print(result)
# Output: ['Twelve:', ' Eighty nine:', '.']
パターンが見つからない場合、re.split() 元の文字列を含むリストを返します。
maxsplit を超えることができます re.split() への引数 方法。発生する分割の最大数です。
import re
string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'
# maxsplit = 1
# split only at the first occurrence
result = re.split(pattern, string, 1)
print(result)
# Output: ['Twelve:', ' Eighty nine:89 Nine:9.']
ちなみにmaxsplitのデフォルト値は 0です。考えられるすべての分割を意味します。
re.sub()
re.sub() の構文 です:
re.sub(pattern, replace, string) このメソッドは、一致した出現箇所が replace の内容に置き換えられた文字列を返します
例 3:re.sub()
# Program to remove all whitespaces
import re
# multiline string
string = 'abc 12\
de 23 \n f45 6'
# matches all whitespace characters
pattern = '\s+'
# empty string
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string)
# Output: abc12de23f456
パターンが見つからない場合、re.sub() 元の文字列を返します。
count を渡すことができます re.sub() の 4 番目のパラメータとして 方法。省略した場合、結果は 0 になります。これにより、すべての出現箇所が置き換えられます。
import re
# multiline string
string = 'abc 12\
de 23 \n f45 6'
# matches all whitespace characters
pattern = '\s+'
replace = ''
new_string = re.sub(r'\s+', replace, string, 1)
print(new_string)
# Output:
# abc12de 23
# f45 6
re.subn()
re.subn() re.sub() に似ています ただし、新しい文字列と行われた置換の数を含む 2 つの項目のタプルを返します。
例 4:re.subn()
# Program to remove all whitespaces
import re
# multiline string
string = 'abc 12\
de 23 \n f45 6'
# matches all whitespace characters
pattern = '\s+'
# empty string
replace = ''
new_string = re.subn(pattern, replace, string)
print(new_string)
# Output: ('abc12de23f456', 4)
re.search()
re.search() メソッドは、パターンと文字列の 2 つの引数を取ります。このメソッドは、RegEx パターンが文字列と一致する最初の場所を探します。
検索が成功した場合、re.search() 一致オブジェクトを返します。そうでない場合は、None を返します。 .
match = re.search(pattern, str) 例 5:re.search()
import re
string = "Python is fun"
# check if 'Python' is at the beginning
match = re.search('\APython', string)
if match:
print("pattern found inside the string")
else:
print("pattern not found")
# Output: pattern found inside the string
ここで、マッチ 一致オブジェクトが含まれています。
一致オブジェクト
dir() 関数を使用して、一致オブジェクトのメソッドと属性を取得できます。
一般的に使用される一致オブジェクトのメソッドと属性の一部を以下に示します:
match.group()
group() メソッドは、一致する文字列の部分を返します。
例 6:マッチ オブジェクト
import re
string = '39801 356, 2102 1111'
# Three digit number followed by space followed by two digit number
pattern = '(\d{3}) (\d{2})'
# match variable contains a Match object.
match = re.search(pattern, string)
if match:
print(match.group())
else:
print("pattern not found")
# Output: 801 35
ここで、マッチ 変数に一致オブジェクトが含まれています。
私たちのパターン (\d{3}) (\d{2}) 2 つのサブグループ (\d{3}) があります と (\d{2}) .これらの括弧で囲まれたサブグループの文字列の一部を取得できます。方法は次のとおりです:
>>> match.group(1)
'801'
>>> match.group(2)
'35'
>>> match.group(1, 2)
('801', '35')
>>> match.groups()
('801', '35')
match.start()、match.end()、および match.span()
start() 関数は、一致した部分文字列の開始位置のインデックスを返します。同様に、end() 一致した部分文字列の終了インデックスを返します。
>>> match.start()
2
>>> match.end()
8
span() 関数は、一致した部分の開始インデックスと終了インデックスを含むタプルを返します。
>>> match.span()
(2, 8) match.re と match.string
re 一致したオブジェクトの属性は、正規表現オブジェクトを返します。同様に、string 属性は渡された文字列を返します。
>>> match.re
re.compile('(\\d{3}) (\\d{2})')
>>> match.string
'39801 356, 2102 1111'
re で定義されている一般的に使用されるメソッドをすべてカバーしました。 モジュール。詳細については、Python 3 re モジュールにアクセスしてください。
正規表現の前に r プレフィックスを使用する
r時 または R 接頭辞は正規表現の前に使用され、生の文字列を意味します。例:'\n' r'\n' に対して改行です 2 つの文字を意味します:バックスラッシュ \ 続いて n .
バックラッシュ \ すべてのメタ文字を含むさまざまな文字をエスケープするために使用されます。ただし、r を使用すると 接頭辞は \ になります 通常のキャラクターとして扱います。
例 7:r プレフィックスを使用した生の文字列
import re
string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string)
print(result)
# Output: ['\n', '\r']
Python