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

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 .

- を使用して文字の範囲を指定することもできます 角括弧内。

キャレット ^ を使用して文字セットを補完 (反転) できます 角括弧の先頭の記号。


. - 期間

ピリオドは任意の 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 一致 (12345673 )
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

  1. Python のキーワードと識別子
  2. Python データ型
  3. Python 演算子
  4. Python pass ステートメント
  5. Python 関数の引数
  6. Python 辞書
  7. Python イテレータ
  8. Python クロージャー
  9. Python 日時
  10. Python 時間モジュール
  11. Pythonスリープ()