regexまたはreと呼ばれる正規表現は、高度なテキストパターンマッチングを表します。これはテキスト処理の重要な方法であり、文字列の取得と置換に一般的に使用されます。これは最初にunixテキストエディタで使用され、現在ではほとんどすべての高レベルのプログラミング言語が正規表現をサポートしています。
pythonでは、組み込みモジュールreを使用して通常の式を使用できます。
単一の文字に一致します
複数の文字に一致
その他の試合
Pythonのreモジュールは、さまざまなシナリオに従って文字列の定期的な抽出を実装できる多くのマッチングメソッドを提供します。
機能 | 説明 | 戻り値 |
---|---|---|
match(pattern、string、flags = 0) | オプションのフラグを含む通常の式パターンを使用して文字列を照合します | 照合が成功した場合は一致するオブジェクトを返し、失敗した場合はなしを返します |
search(pattern、string、flags = 0) | オプションのタグを使用して、文字列内の正規式パターンの最初の出現を検索します | 一致が成功した場合は一致したオブジェクトを返し、失敗した場合はなしを返します |
findall(pattern、string [、flags]) | 文字列内のすべての(繰り返されない)正規式パターンを検索 | 一致リスト |
finditer(pattern、string [、flags]) | findallと同じですが、リストを返す代わりに | イテレーター |
split(pattern、string、max = 0) | 正規式のパターンセパレーターによると、split関数は文字列をリストに分割し、成功した一致のリストを返します。分割は最大回数まで操作され、すべての一致位置はデフォルトで分割されます | 分割リスト |
sub(pattern、repl、string、count = 0) | replを使用して、通常の式パターンが文字列に現れるカウント回数を置き換えます。デフォルトではすべてを置き換えます | 置換操作の数 |
パージ() | 暗黙的にコンパイルされた通常の式パターンをクリアします;キャッシュをクリアします |
1. matchは文字列の最初の文字から始まり、一致しない場合はNoneを返し、一致する場合はオブジェクトを返します
a ='A83C72D1D8E67'
r = re.match('A83',a)print(r) #オブジェクトの場所を返します
print(r.group()) #グループ方式を使用してデータを抽出する
print(r.span())#一致する位置(開始、終了)を表すタプルを返します
出力
< re.Match object; span=(0,3), match='A83'>A83(0,3)
**2. re.compileは、正規式をパターンオブジェクトに変換して、マッチング効率を向上させます。コンパイル変換を1回使用した後は、後でモードを使用するたびに変換する必要はありません。 ****
compile(pattern, flags=0)
パターン:規則的な表現を書く
フラグ:マッチングモード
返されるのは一致するオブジェクトであることがわかります。単独で使用する意味はありません。findall()、search()、およびmatch()と組み合わせて使用する必要があります。
res = re.compile('\w+')
res2 = res.search('*##abcd123_ABC####123').group()#Searchはmatchと似ていますが、文字列全体を検索し、指定した文字が最初に一致した場合は値を返し、一致しなかった場合はNoneを返す点が異なります。
print(res2)
出力
abcd123_ABC
**3. findallは、文字列内の指定された値に関連するすべての値と一致し、リストの形式で返します。一致しない場合は、空のリストを返します。 ****
res = re.findall('ab+','abcdabddac')print(res)
出力
[' ab','ab']
**4. re.split(pattern、string [、maxsplit = 0、flags = 0]):一致に従って文字列を分割し、リストを返します。 ****
res = re.split('\W','123#abc#')print(res)
出力
['123',' abc','']
**5. 文字列置換re.sub **
import re
a ='abcABC'
r = re.sub('abc','ABC',a)print(r)
Pythonの量子化子はデフォルトで貪欲であり、常にできるだけ多くの文字に一致しようとします。
貪欲でない演算子「?」は、「*」、「+」、「?」の後に使用されます。必要な定期的なマッチングは少ないほど良いです。
res = re.findall('(p.+)','pythonpythonpython')print(res)
出力
[' pythonpythonpython']
res = re.findall('(p.+?)','pythonpythonpython')print(res)
出力
[' py','py','py']
Pythonでは、文字列の前にrが付き、rは生の省略形を意味し、生の文字列はネイティブ文字を意味します。つまり、文字列の途中にある特殊な文字をエスケープする必要はありません。たとえば、「\ n」を表現する場合は、次のように実行できます。
r'\n'
規則表現を故意に覚える必要がないことに注意が必要です。一般的に使用されている規則表現はインターネットで見つけることができます。もちろん、組み込みの方法を使用してマッチングを実現してから、規則表現を検討することをお勧めします。
Recommended Posts