Python 3萌新入門ノート(42)


このチュートリアルは、組み込みモジュールについての最後の部分で、より多くの組み込みモジュールについては、公式ドキュメントを参照してください.
十三、reモジュール
『Python 3萌新入門ノート(23)』では,正規表現の使用に触れ,reモジュールのmatch()関数とcompile()関数を用いた.
サンプルコード:
import re

print(re.match(r'Python.', 'Python
', re.DOTALL)) # :<_sre.sre_match object="" span="(0," match="Python
"> print(re.match(r'Python.', 'Python\r')) # :<_sre.sre_match object="" span="(0," match="Python\r"> print(re.match(r'Python.', 'Python!')) # :<_sre.sre_match object="" span="(0," match="Python!"> print(re.match(r'Python.', 'Python
')) # :None pat=re.compile(r'^[A-Z][0-9a-z]{5,}') # : , , 6 。 print(pat.match('Ab12345')) print(pat.match('Ab123')) print(pat.match('ab1234')) print(pat.match('A@1234'))
上記の2つの関数に加えて、reモジュールには呼び出しのための他の関数があります(ここでは主要パラメータのみが表示されます).
search(pattern,string):文字列パラメータstringから正規表現patternに一致するサブ文字列を検索し、一致するサブ文字列が検索された場合、matchオブジェクトを返します.そうでなければ、Noneを返します.
search()関数で取得したmatchオブジェクトはgroup()メソッドでサブ文字列を取得できます.
サンプルコード:
result = re.search(r'  .{2}', '       !       !')
print(result)  #        :<_sre.sre_match object="" span="(3," match="    ">
print(result.group())  #        :    

print(re.search('  .+', '       !       !'))  #        :None
ただし、searchは最初の一致するサブ文字列しか取得できません.
一致するすべてのサブ文字列を取得するにはfindall()関数を使用します.
findall(pattern,string):文字列パラメータstringから正規表現patternに一致するすべてのサブ文字列を検索し、一致するサブ文字列が検索された場合、すべてのサブ文字列を含むリストを返します.そうでない場合、空のリストを返します.
サンプルコード:
result = re.findall(r'  .{2}', '       !       !')
print(result)  #        :['    ', '    ']

print(re.findall(r'  .+', '       !       !'))  #        :[]
findall()関数は、一致するすべてのサブ文字列をリストに保存できます.
一致するサブ文字列の数が膨大で、すべての一致結果を一度に得たくない場合はfinditter()関数を使用します.
finditter(pattern,string):文字列string内のすべての重複しないマッチングによって生成されたmatchオブジェクトの反復器を返します.
サンプルコード:
result=re.finditer(r'  .{2}', '       !       !')
for i in result:
    print(i.group())
クエリー機能に加えて、reモジュールは文字列を分割するためのsplit()関数を提供します.
split(pattern,string,maxsplit=0):パラメータpatternは区切り文字をマッチングするために使用され、マッチングした区切り文字に基づいてパラメータ文字列stringを分割し、分割後のサブ文字列リストを返します.パラメータmaxsplitは最大分割回数です.一致する区切り文字がない場合は、パラメータ文字列stringを含むリストを返します.
result=re.split(r'\.+', '    ...    .     ')
print(result)#        :['    ', '    ', '     ']
result=re.split(r'\.+', '    ...    .     ',1)
print(result)#        :['    ', '    ..     ']

print(re.split(r',+', '    ...    ..     '))  #        :['    ...    .     ']
次にfullmatch()関数です.
fullmatch(pattern,string):文字列全体が正規表現と一致すると、対応するmatchオブジェクトが返されます.文字列が正規表現と一致しない場合はNoneを返します.これはゼロの長さと一致しないことに注意してください.
print(re.fullmatch(r'  .+', '    '))  #        :<_sre.sre_match object="" span="(0," match="    ">
print(re.fullmatch(r'  .{2}', '    '))  #        :<_sre.sre_match object="" span="(0," match="    ">
print(re.fullmatch(r'  .{1}', '    '))  #     ,       :None
reモジュールにはmatchオブジェクトを置き換える関数sub()もあります.
sub(pattern,repl,string,count=0):文字列stringで一致するサブ文字列をパラメータreplで置き換え、文字列全体を返します.一致するサブ文字列が見つからない場合は、変更されていない文字列stringを返します.パラメータreplは文字列であってもよいし、関数であってもよい.文字列の場合、関数は文字列内のすべての反スラッシュを処理します.たとえば、「」を改行文字に変換したり、「r」を折り返し文字に変換したりします.有効なエスケープでない場合は、保持されます.「1」などの逆参照では、一致したmatchオブジェクトの1番目の文字列のセットをreplと新しい文字列に取得できます.
たとえば、次の文字列があります.
names = r'   ,   ,  ,  ,   ,   '
1、すべての3文字の李姓の名前のうち、前の2つの名前を「」に置き換えると、サンプルコードは以下の通りです.
print(re.sub(r' .(?!,).', '\\\\', names, 2))  #        :\,   ,  ,  ,\,   
上のコードでは、次の点に注意してください.
「\\」は最終的に「」と表示されます.これは、4つの「」がPython解釈器と正規表現でそれぞれ1回変換されるためです.正規表現の「李.」後ろの「.」マッチングの長さは3ビットと決定した.正規表現の「(?!,)」ゼロ幅の断言で、一致した部分から「李.」最初に、後方の1文字目に一致検証を続行し、文字が「,」でない場合は「.」を通過します.この文字を取得し、現在の一致が正常に完了しました.それ以外の場合、取得したサブ文字列は3ビット未満で、現在の一致に失敗します.2、すべての3文字の李姓のうち前の2つの名前の姓を「*」に置き換えると、サンプルコードは以下の通りです.
print(re.sub(r' (.)(?!,)(.)', r'*\1\2', names,2))  #        :*  ,   ,  ,  ,*  ,   
上のコードでは、一致に成功した場合、2つの「(.)」取得したコンテンツはmatchオブジェクトのgroupに格納されます.この2つのグループの内容は、置換文字列の「12」によって取得され、逆参照になります.
3、すべての2~3文字の李姓の名前を取得し、「[]」を付けます.
print(re.sub(r' .?(?!,).', lambda x: '[' + x.group() + ']', names))  
#        :[   ],   ,[  ],  ,[   ],[   ]
上のコードでは、次の点に注意してください.
「李.?」最後の「.」マッチングの長さは2~3ビットと決定した.正規表現は「李.?」を先に完成します.を選択します.この文字を取得し、3ビットの名前文字列に一致します.そうでない場合は、2桁の名前文字列に一致します.Lambda式は、一致に成功したmatchオブジェクトを取得し、group()メソッドでサブ文字列を取得した後、「[]」付き文字列を返します.subn()関数はsub()関数と一致するが,新しい文字列と置換回数を含むメタグループを返す.
サンプルコード:
print(re.subn(r' .?(?!,).', lambda x: '[' + x.group() + ']', names)) 
#        :('[   ],   ,[  ],  ,[   ],[   ]', 4)
 
一致する文字列にPython解釈器で正規表現演算子として解釈される可能性のある文字が含まれている場合は、escape()関数を使用してすべてのエスケープを実行できます.
Escape(pattern):この関数は、ASCII文字、数値、および下線「」を除いて、パラメータ文字列patternを使用できます.以外のすべての文字をエスケープし、新しい文字列を返します.
サンプルコード:
print(re.escape(r'C:\Users\Administrator\Desktop\date.dat'))  
#        :C\:\\Users\\Administrator\\Desktop\\date\.dat
上記の関数のほかにreがある.purge()関数.キャッシュ内の正規表現を空にします.
以上はreモジュールに関する関連関数であり,これらの関数とともにいくつかの方法が含まれている.たとえば、既に使用されているgroup()メソッドとgroups()メソッドです.
group([group 1,...]):パラメータの個数に応じて、結果がmatchオブジェクトのいずれかのグループのコンテンツまたは複数のグループのコンテンツのメタグループを返し、パラメータgroupが0またはパラメータを省略した場合、一致する文字列を取得することができ、パラメータgroupが0より大きい場合またはあるキー値の場合、結果が対応するサブ文字列に戻る.
groups(default=None):結果がmatchオブジェクト内のすべてのサブ文字列のメタグループを返します.パラメータdefaultは、存在しないグループのデフォルト値を指定できます.
start([group]):matchオブジェクトのサブ文字列のセットが一致する文字列の開始位置に返されます.
end([group]):matchオブジェクトのサブ文字列のセットが一致する文字列で終了する位置の次の位置を返します.
span([group]):matchオブジェクトのサブ文字列のセットが、一致する文字列の開始位置と終了位置の次の位置からなるメタグループを返します.
groupdict(default=None):結果がmatchオブジェクト内のすべてのサブ文字列とそのキー値の辞書を返します.パラメータdefaultは、存在しないグループのデフォルト値を指定できます.
サンプルコード:
path = r'C:\Users\Administrator\Desktop\\'  #          
pat = re.compile(r'..\\(\w+)\\(\w+)\\(\w+)\\(\w+)?')  #              

result = pat.match(path)
print(result)  #        :<_sre.sre_match object="" span="(0," match="C:\\Users\\Administrator\\Desktop\\">
print(result.groups())  #        :('Users', 'Administrator', 'Desktop', None)
print(result.groups(default='date'))  #        :('Users', 'Administrator', 'Desktop', 'date')
print(result.group(0))  #        :C:\Users\Administrator\Desktop\
print(result.group(1,2))  #        :('Users', 'Administrator')
print(result.start(1))  #        :3
print(result.end(1))  #        :8
print(result.span(1))  #        :(3,8)

dict_pat = re.compile(r'..\\(?P\w+)\\(?P\w+)\\(?P\w+)\\')  #            
result_dict = dict_pat.match(path)
print(result_dict.groupdict())  #        :{'    ': 'Users', '    ': 'Administrator', '    ': 'Desktop'}
print(result_dict.group('    '))  #        :Users
上のコードでは、正規表現に書かれた「?P」は、取得したサブ文字列にキー値を指定します.
このセクションの知識点:
reモジュール
この節の英語の単語と中国語の意味:
1、search:検索
2、pattern:モード
3、find:発見
4、split:分割
5、full:完全
6、repl(replace):置換
7、sub:代替
8、subn(sub number):代替回数
9、escape:回避
10、purge:クリア
11、span:スパン
转载请注明:魔力Python»Python 3萌新入门笔记(42)