ホームページ  >  記事  >  バックエンド開発  >  Python 正規表現の概要

Python 正規表現の概要

WBOY
WBOYオリジナル
2016-06-16 08:47:02939ブラウズ

注: この記事は Python2.4 に基づいています。理解できない用語がある場合は、Baidu、Google、Wiki などを思い出してください。

1. 正規表現の基本
1.1. 簡単な紹介

正規表現は Python の一部ではありません。正規表現は、文字列を処理するための強力なツールです。独自の構文と独立した処理エンジンを備えています。str 独自のメソッドほど効率的ではないかもしれませんが、非常に強力です。このおかげで、正規表現の構文は、正規表現を提供する言語で同じになります。唯一の違いは、異なるプログラミング言語の実装によってサポートされる構文の数が異なることです。ただし、サポートされていない構文は通常は一部です。それは一般的には使用されません。すでに他の言語で正規表現を使用している場合は、ざっと確認するだけで使い始めることができます。

次の図は、正規表現を使用した照合プロセスを示しています。

re_simple

正規表現の大まかな照合プロセスは次のとおりです。 式とテキストを順に取り出し、比較します。すべての文字が一致する場合、一致は成功します。一致しない文字がある場合、一致は失敗します。式に量指定子や境界がある場合、プロセスは若干異なりますが、以下の図の例を見て、自分で何度か使用すると、簡単に理解できるようになります。

次の図は、Python でサポートされている正規表現のメタ文字と構文を示しています:

pyre

1.2 量指定子の貪欲モード-greedy pattern

正規表現は、テキスト内の一致する文字列を検索するためによく使用されます。 Python の量指定子はデフォルトで貪欲であり (一部の言語ではデフォルトで非貪欲)、常にできるだけ多くの非貪欲な文字と一致しようとします。逆に、常にできるだけ少ない文字と一致しようとします。たとえば、「abbbc」を検索するために正規表現「ab*」を使用すると、「abbb」が検索されます。また、貪欲でない量指定子「ab*?」を使用すると、「a」が見つかります。

1.3. バックスラッシュの問題

ほとんどのプログラミング言語と同様に、「"」は正規表現のエスケープ文字として使用され、バックスラッシュの問題を引き起こす可能性があります。テキスト内の文字「」と一致する必要がある場合、プログラミング言語で表現される正規表現には 4 つのバックスラッシュ「\\」が必要です。最初の 2 つと最後の 2 つは、プログラミング言語でバックスラッシュにエスケープするために使用され、変換されます。正規表現では 2 つのバックスラッシュに変換され、その後 1 つのバックスラッシュにエスケープされます。 Python のネイティブ文字列は、この問題を非常にうまく解決します。この例の正規表現は r"\" で表すことができます。同様に、数値に一致する「\d」は r"d" と書くことができます。ネイティブ文字列を使用すると、バックスラッシュの欠落を心配する必要がなくなり、作成する式がより直感的になります。

1.4. マッチング パターン

正規表現では、大文字と小文字の区別や複数行のマッチングなど、利用可能なマッチング パターンが提供されます。この部分は、パターンクラス(pattern[, flags])もまとめて紹介します。

2. re モジュール

2.1. re の使用を開始する

Python は re モジュールを通じて正規表現をサポートします。 re を使用するための一般的な手順は、まず正規表現の文字列形式を Pattern インスタンスにコンパイルし、次に Pattern インスタンスを使用してテキストを処理し、一致結果 (Match インスタンス) を取得し、最後に Match インスタンスを使用して情報を取得し、その他の操作を実行します。

コードをコピー コードは次のとおりです:

# エンコーディング: UTF-8
import re
#正規表現の変換 式を Pattern オブジェクトにコンパイルします。
pattern = re.compile(r'hello')
# Pattern を使用してテキストを照合し、一致しない場合は None が返されます match = pattern.match('hello world !')
if match:
# Match を使用してグループ情報を取得します
print match.group()
### 出力 ###
#こんにちは


re.compile(strPattern[, flag]):
このメソッドは、Pattern クラスのファクトリ メソッドであり、文字列形式の正規表現を Pattern オブジェクトにコンパイルするために使用されます。 2 番目のパラメーター フラグは、ビットごとの OR 演算子 '|' を使用して、同時に有効であることを示します (re.I | re.M)。さらに、正規表現文字列でパターンを指定することもできます。たとえば、re.compile('pattern', re.I | re.M) は re.compile('(?im)pattern') と同等です。
オプションの値は次のとおりです:
re.I(re.IGNORECASE): 大文字と小文字を無視します (完全な記述は括弧内にあります。以下同様)
M(MULTILINE): 複数行モード、変更 '^ ' と '$' の動作 (上の図を参照)
S(DOTALL): 一致するパターンをクリックして '.' の動作を変更します
L(LOCALE): 所定の文字クラスを作成します w W b B s S は現在のロケールに依存します
U(UNICODE): 所定の文字クラスを w W b B s S d D を Unicode で定義された文字属性に依存させます
X(VERBOSE): 冗長モード。このモードでは、正規表現を複数行にすることができ、空白文字は無視され、コメントを追加できます。次の 2 つの正規表現は同等です:
コードをコピー コードは次のとおりです:

a = re.compile(r """d + # 整数部
. # 小数点
d * # 一部の小数点""", re.X)
b = re.compile(r"d+.d *" )

は、正規表現関数を完成させるための多数のモジュール メソッドを提供します。これらのメソッドは、Pattern インスタンスの対応するメソッドで置き換えることができます。唯一の利点は、記述される re.compile() コードが 1 行少なくなることですが、同時にコンパイルされた Pattern オブジェクトを再利用することはできません。これらのメソッドは、Pattern クラスのインスタンス メソッド セクションでまとめて紹介されます。たとえば、上記の例は次のように省略できます:
コードをコピー コードは次のとおりです:

m = re。 match(r'hello' , 'hello world!')
print m.group()

re モジュールは、次のような文字列内の正規表現メタ文字用のメソッド escape(string) も提供します。 * /+/? の前にエスケープ文字を追加してから戻ります。これは、多数のメタ文字を一致させる必要がある場合に便利です。
2.2. Match
Match オブジェクトは一致の結果であり、Match が提供する読み取り可能なプロパティまたはメソッドを使用してこの情報を取得できます。
属性:
文字列: マッチング時に使用されるテキスト。
re: マッチングに使用されるパターン オブジェクト。
pos: 正規表現検索が開始されるテキスト内のインデックス。この値は、Pattern.match() メソッドおよび Pattern.seach() メソッドの同名のパラメータと同じです。
endpos: 正規表現検索が終了するテキスト内のインデックス。この値は、Pattern.match() メソッドおよび Pattern.seach() メソッドの同名のパラメータと同じです。
lastindex: テキスト内で最後にキャプチャされたグループのインデックス。パケットがキャプチャされなかった場合は None になります。
lastgroup: 最後にキャプチャされたグループのエイリアス。このグループにエイリアスがない場合、またはキャプチャされたグループがない場合は、None になります。
メソッド:
group([group1, …]):
1 つ以上のグループによってインターセプトされた文字列を取得します。複数のパラメーターが指定された場合は、タプルの形式で返されます。 group1 は数値またはエイリアスを使用できます。数値 0 は一致した部分文字列全体を表します。パラメータが入力されていない場合は、group(0) が返されます。回は、最後にインターセプトされた部分文字列を返します。
groups([default]):
すべてのグループのインターセプト文字列をタプルの形式で返します。 group(1,2,…last) を呼び出すことと同等です。デフォルトは、文字列をインターセプトしないグループがこの値に置き換えられることを意味し、デフォルトは None です。
groupdict([default]):
エイリアスのグループのエイリアスをキーとして、グループによってインターセプトされた部分文字列を値として持つ辞書を返します。エイリアスのないグループは含まれません。デフォルトの意味は上記と同じです。
start([group]):
指定されたグループによってインターセプトされた部分文字列の文字列内の開始インデックス (部分文字列の最初の文字のインデックス) を返します。グループのデフォルト値は 0 です。
end([group]):
文字列内の指定されたグループによってインターセプトされた部分文字列の終了インデックス (部分文字列の最後の文字のインデックス + 1) を返します。グループのデフォルト値は 0 です。
span([グループ]):
戻り値 (開始(グループ)、終了(グループ))。
expand(template):
一致したグループをテンプレートに入れて戻ります。 id または g、g を使用してテンプレート内のグループを参照できますが、数値 0 は使用できません。 id は g; と同等ですが、10 は 10 番目のグループとみなされます。1 の後に文字「0」が続くことを表現したい場合は、g<1>0 のみを使用できます。
コードをコピー コードは次のとおりです:

import re
m = re.match(r'(w+) (w+)(?P.*)', 'hello world!')
print "m.string :", m.string
print "m.re:", m.re
print "m.pos:", m.pos
print "m.endpos:", m.endpos
print "m.lastindex:", m.lastindex
print "m.lastgroup:", m.lastgroup
print "m.group(1,2):", m.group(1, 2)
print "m.groups():", m.groups()
print "m.groupdict():", m.groupdict()
print "m.start(2):", m.start(2)
print "m.end(2):", m.end(2)
print "m.span(2):", m.span(2)
print r"m.expand(r'2 13'):", m.expand(r'2 13')
### 出力 ###
# m.string: hello world!
# m.re:
# m.pos: 0
# m.endpos: 12
# m.lastindex: 3
# m.lastgroup: 符号
# m.group(1,2): ( 'hello', 'world')
# m.groups(): ('hello', 'world', '!')
# m.groupdict(): {'sign': '!'}
# m.start(2): 6
# m.end(2): 11
# m.span(2): (6, 11)
# m.expand(r' 2 13'): ワールドハロー!

2.3.パターン
パターン オブジェクトは、パターンが提供する一連の方法によってテキストの適合を実行できる、適切な表現形式です。 >パターンは、表現式を取得するために使用される、次の関連情報を提供します。
パターン: 評価時に使用される表現形式の文字列。
フラグ: 評価時に使用される適合モード。

groupindex: 表式内に名前が含まれるグループの名前はセキュリティであり、そのグループに対応する番号は値の文字典であり、そのグループには名前は含まれません。


复制代码
代码如下: import re p = re.compile(r'(w+) (w+)(? P.*)', re.DOTALL)
print "p.pattern:", p.pattern
print "p.flags:", p.flags
print "p.groups: ", p.groups
print "p.groupindex:", p.groupindex
### Output ###
# p.pattern: (w+) (w+)(?P. *)
# p.flags: 16
# p.groups: 3
# p.groupindex: {'sign': 3}



实例方法[ | re模块方法]:
1、match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]): このメソッドは、文字列の位置の下にあるパターンを呼び出します。一致パターンが完了した場合、一致可能です。一致オブジェクトが返されます。一致途中のパターンであれば、
pos と endpos の指定値はそれぞれ 0 と len(string) です。re.match() はこの 2 つのパラメータを指定できません。パラメータflags は、
注意: この方法は完全な一致ではありません。パターンの終了時に文字列に残りの文字があれば成功とみなされます。
2.1 の例を参照してください。
2、search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):
このメソッドは、文字列内で一致する可能性がある子列を検索するために使用されます。パターンの終了時に一致する場合、文字列の pos の下から一致パターンを開始します。
pos と endpos の値は、それぞれ 0 と len(string) です。
pos と endpos の値は、それぞれ 0 と len(string) です。 );re.search() はこの 2 つのパラメータを無法で指定し、パラメータフラグはパターンの一致モードを指定するために使用されます。 >

# エンコーディング: UTF-8
import re
# 将正则表达式编译成パターン对象 pattern = re.compile(r'world') # usesearch () 查找適合の子串、存在しない能適合の子串の場合は返しません # この例では match() 無法成功適合 match = pattern.search('hello world!') if match:
# 使用Match获得分组情報
print match.group()
### 出力 ###
# world


3、split(文字列[, maxsplit]) | re.split(pattern, string[, maxsplit]):
一致する子列を文字列分割した後、列表を返します。maxsplit は最大分割次数を指定するために使用され、全体分割は指定されません。 🎜>
复制代码

代码如下:


import re p = re.compile(r'd+')
print p.split(' one1two2three3four4')
### 出力 ###
# ['one', 'two', 'three', 'four', '']
4、findall(文字列[, pos[, endpos]]) | re.findall(pattern, string[, flags]): 検索文字列、リスト形式ですべての能力に適合する子列が返されます。代コード如下:
import re
p = re.compile(r'd+')
print p.findall('one1two2three3four4')
### 出力 ###
# ['1', '2', '3', '4']


5. finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):
文字列を検索し、一致する各結果への順次アクセスを返します (Match オブジェクト)イテレータ。
コードをコピー コードは次のとおりです。

import re
p = re.compile(r'd+' )
for m in p.finditer('one1two2three3four4'):
print m.group(),
### 出力 ###
# 1 2 3 4

6. sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):
repl を使用して、string 内の一致する各部分文字列を置換し、置換された文字列を返します。
repl が文字列の場合、id または g、g を使用してグループを参照できますが、数値 0 は使用できません。
repl がメソッドの場合、このメソッドは 1 つのパラメータ (Match オブジェクト) のみを受け取り、置換用の文字列を返す必要があります (返された文字列でグループを参照することはできません)。
count は置換の最大数を指定するために使用されます。指定しない場合は、すべての置換が行われます。
コードをコピー コードは次のとおりです。

import re
p = re.compile(r'(w+ ) (w+ )')
s = 'こんにちは、世界!'
print p.sub(r'2 1', s)
def func(m):
return m. group(1 ).title() + ' ' + m.group(2).title()
print p.sub(func, s)
### 出力 ###
# Say i 、ワールドハロー!
# こんにちは、ワールド!

7. subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]) :
Return (sub(repl, string[, count]), 置換数)。
コードをコピー コードは次のとおりです。

import re
p = re.compile(r'(w+ ) (w+ )')
s = 'こんにちは、世界!'
print p.subn(r'2 1', s)
def func(m):
return m. group(1 ).title() + ' ' + m.group(2).title()
print p.subn(func, s)
### 出力 ###
# (' Say i, world hello!', 2)
# ('I Say, Hello World!', 2)

上記は Python の正規表現のサポートです。正規表現に習熟することは、すべてのプログラマーが備えなければならないスキルです。現在、文字列を扱わないプログラムはありません。筆者もまだまだ初期段階ですが、頑張ってください^_^
なお、図には特殊な構造の例が無く、これらの正規表現の使い方が難しいです。興味があれば、abc で始まらない単語を一致させる方法を考えてみてください ^_^
全文終わり
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。