Python正規表現のコンパイル済み正規表現(2)

ステートメント

よる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)

実装のスクリーンショット:
ここに画像の説明を挿入します

リストが大きい場合は、イテレータを返す方がはるかに効率的です。

おすすめ

転載: blog.csdn.net/CSNN2019/article/details/114465950