ステートメント
よるPythonの正規表現エンジンの再インタフェースモジュールを提供しながら、オブジェクトモデルにコンパイルあなたの正規表現を可能、と一致させるためにそれらを使用。
注:
reモジュールはC言語で記述されているため、通常の文字列メソッドを使用するよりも効率がはるかに高くなります。正規表現をコンパイルすると、効率がさらに向上します。後で「モード」を参照することがよくあります。パターンオブジェクトを参照します。正規表現はにコンパイルされます。
正規表現をコンパイルする
正規表現はパターンオブジェクトにコンパイルされます。パターンオブジェクトには、パターンの一致の検索や文字列の置換の実行など、文字列を操作するためのさまざまなメソッドがあります。
import re
p = re.compile('ab*')
re.compile()
さまざまな特別な機能や構文のバリエーションを開くflags
ために使用されるパラメーターを受け入れることもできます。
>>> p = re.compile('ab*', re.IGNORECASE)
正規表現は文字列パラメータとして渡されますre.compile()
。正規表現はのPython
コア部分ではないため、特別な構文サポートを提供しないため、正規表現は文字列表現のみになります。(一部のアプリケーションは正規表現をまったく使用する必要がないため、Pythonコミュニティの友人は、正規表現をPythonのコアに組み込む必要はないと考えています。)逆に、reモジュールは拡張機能としてPythonにのみ含まれています。ソケットモジュールやzlibモジュールと同じように、Cのモジュール。
面倒なバックスラッシュ
正規表現は、'\'
文字を使用して、特殊能力を持ついくつかの一般的な文字を作成するか(たとえば\d
、任意の10進数に一致することを意味します)、またはいくつかの特殊文字の能力を奪われます(たとえば、\[
左角かっこに一致することを示します'['
)。これはPython
文字列の後に続き、競合と同じ機能を実現します。
文字列に一致する正規表現でLaTeX
ファイルを使用する必要がある場合。ので、バックスラッシュが特殊文字で一致する必要があり、あなたがする必要があるバックスラッシュを追加し、それは前にその特殊機能のそれを奪います。したがって、正規表現の文字を次のように記述します。'\section'
'\\section'
Pythonはまた、文字列でバックスラッシュを使用して特別な意味を表現します。したがって、'\\section'
パスを完了したい場合は、re.compile()
もう一度2つの円記号を追加する必要があります...
文字を一致させる | マッチングフェーズ |
---|---|
\section |
照合する文字列 |
\\section |
正規表現'\\' は文字の一致を表します'\' |
"\\\\section" |
残念ながら、Python文字列は'\\' 表現文字を使用することもできます'\' |
つまり、円記号を一致させるには、文字列で4つの円記号を使用する必要があります。したがって、正規表現でバックスラッシュを頻繁に使用すると、バックスラッシュの嵐が発生し、文字列を非常に理解しにくくなります。
解決策は、Pythonの元の文字列を使用して正規表現を表すことです(つまり、文字列の前にrを追加します。覚えておいてください...):
通常の文字列 | 生の文字列 |
---|---|
"ab*" |
r"ab*" |
"\\\\section" |
r"\\section" |
"\\w+\\s+\\1" |
r"\w+\s+\1" |
正規表現を表現するには、生の文字列を使用することをお勧めします。
マッチングを実現
正規表現をコンパイルすると、パターンオブジェクトが得られます。あなたは彼と何ができますか?パターンオブジェクトには多くのメソッドとプロパティがあります。以下で最も重要なものを列挙しましょう。
方法 | 特徴 |
---|---|
match() |
正規表現が最初から文字列と一致するかどうかを判断します |
search() |
文字列をトラバースして、正規表現に一致する最初の位置を見つけます |
findall() |
文字列をトラバースし、正規表現に一致するすべての位置を見つけて、リストの形式で返します |
finditer() |
文字列をトラバースし、正規表現に一致するすべての位置を見つけて、イテレータの形式で返します |
一致が見つからない場合、次いで、match()
及びsearch()
返されNone
、一致が成功した場合、それが一致するオブジェクトを返し、例えば:(マッチオブジェクト)は、すべての一致は、その情報が含まサブストリングに一致など、末尾に、開始するために。
match()
次に、ステップバイステップで説明します。
>>> import re
>>> p = re.compile('[a-z]+')
>>> p
re.compile('[a-z]+')
実装のスクリーンショット:
これで、正規表現[a-z]
+を使用してさまざまな文字列に一致させることができます。
例えば:
>>> p.match("")
>>> print(p.match(""))
None
実装のスクリーンショット:
+
は1回以上一致することを示しているため、空の文字列の一致にすることはできません。したがって、をmatch()
返しNone
ます。
一致する可能性のある別の文字列を試してみましょう。
>>> m = p.match('fish')
>>> m
<_sre.SRE_Match object; span=(0, 4), match='fish'>
実装のスクリーンショット:
この例ではmatch()
、一致するオブジェクトが返され、将来使用するために変数mに格納されます。
次に、一致するオブジェクトにどのような情報があるかを見てみましょう。一致するオブジェクトには多くのメソッドとプロパティが含まれていますが、最も重要なものは次のとおりです。
方法 | 特徴 |
---|---|
group() |
一致した文字列を返します |
start() |
試合の開始位置を返す |
end() |
試合の終了位置を返す |
span() |
一致する位置(開始、終了)を表すタプルを返します |
>>> m.group()
'fish'
>>> m.start()
0
>>> m.end()
4
>>> m.span()
(0, 4)
実装のスクリーンショット:
文字列の先頭にある正規表現に一致するのmatch()
はチェックのみであるため、start()は常に0を返します。
search()
ただし、search()メソッドは異なります。
>>> print(p.match('^_^fish'))
None
>>> m = p.search('^_^fish')
>>> print(m)
<_sre.SRE_Match object; span=(3, 7), match='fish'>
>>> m.group()
'fish'
>>> m.span()
(3, 7)
>>> m=p.search('^_^f123i54sh')
>>> m
<re.Match object; span=(3, 4), match='f'>
実装のスクリーンショット:
実際のアプリケーションでは、最も一般的な方法は、一致するオブジェクトをローカル変数に格納し、戻り値がNoneであるかどうかを確認することです。
フォームは通常次のとおりです。
p = re.compile( ... )
m = p.match( 'string goes here' )
if m:
print('Match found: ', m.group())
else:
print('No match')
一致するすべての結果を返す方法は2つあり、1つはで、もう1つはfindall()
ですfinditer()
。
findall()
findall()
返されるのはリストです。
>>> p = re.compile('\d+')
>>> p.findall('3只小狗,15条腿,多出的3条在哪里?')
['3', '15', '3']
実装のスクリーンショット:
finditer()
findall()
戻る前にリストを作成する必要がありfinditer()
、イテレータとして返された一致するオブジェクトを吸い込みました。
>>> iterator = p.finditer('3只小狗,15条腿,多出的3条在哪里?')
>>> iterator
<callable_iterator object at 0x00000212CE96ADC8>
>>> for match in iterator:
print(match.span())
(0, 1)
(5, 7)
(13, 14)
実装のスクリーンショット:
リストが大きい場合は、イテレータを返す方がはるかに効率的です。