正規表現は、複雑な文字列を検索、置換、解析するための強力で標準的な方法です。Python のすべての正規表現は re モジュールの下にあります。
1 よく使用される一致
^ 文字列の先頭に一致
$ は文字列の末尾に一致
b は単語の境界に一致
d は任意の数値に一致
D は任意の非数値文字に一致
x? は 1 つに一致します オプションの x (x 文字に 1 回または 0 回一致します)
x* は x に 0 回以上一致します
x+ は x に 1 回以上一致します
x{n,m} は少なくとも n 回、最大で m 回一致しますx
(a|b|c) は、a に一致するか、b に一致するか、c に一致します
(x) は一般にメモリ グループを表し、re.search によって返されたオブジェクトの groups() 関数を使用できます。その値を取得する関数
2 汎用
#------------------------------------------------------------------------------- # coding: utf-8 # Purpose:正则表达式 # # Author: zdk # # Created: 26/02/2013 # Copyright: (c) zdk 2013 #------------------------------------------------------------------------------- import re if __name__ == '__main__': addr = "100 BROAD ROAD APT.3" print(re.sub("ROAD","RD",addr)) # 100 BRD RD APT.3 print(re.sub(r"\bROAD\b","RD",addr)) # 100 BROAD RD APT.3 pattern = ".*B.*(ROAD)?" print(re.search(pattern,"ROAD")) #None print(re.search(pattern,"B")) #<_sre.SRE_Match object at 0x0230F020><span style="background-color:#FAFAFA;font-family:Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace;font-size:1em;line-height:1.5;"> </span>
(1) re.sub("ROAD","RD",addr) re.sub関数を使用して文字列addrを検索し、"RD"を使用して条件を満たす式 "ROAD" "Replace
(2) re.sub(r"bROADb","RD",addr), "b" は、Python では "単語の境界" を意味します。これは、文字 "" をエスケープする必要があるためです。 string、これは非常に面倒になる可能性があるため、Python は文字列内のすべての文字がエスケープされていないことを示すために r をプレフィックスとして付けます。
(3) re.search(pattern, "ROAD") この関数には 2 つのパラメータがあり、1 つは正規表現、もう 1 つは文字列です。一致するオブジェクトが見つからない場合、この一致オブジェクトは None を返します。
3 緩やかな正規表現
上記はすべて「コンパクト」タイプの表現であり、今は表現の意味が明確であっても、数か月後に覚えているという保証はありません。したがって、Python では、いわゆる緩い正規表現を使用してインライン ドキュメントのニーズを満たすことができます。次の 2 つの点で、一般的な表現との主な違いがあります。空白文字は無視されます。スペース、タブ、およびキャリッジ リターンは、それ自体と一致しません (緩やかな正規表現内のスペースと一致させたい場合は、その前にバックスラッシュを追加してエスケープする必要はありません)
注は無視してください。通常の Python コードと同様に、コメントは # 記号で始まり、行の終わりで終わります。
#松散带有内联注释的正则表达式 pattern = """ ^ # begin of string M{0,3} # 0 to 3 M (CM|CD|D?C{0,3}) #CM or CD or D or D 0 to 3 C $ #end of string """ print(re.search(pattern,"MCM",re.VERBOSE)) #<_sre.SRE_Match object at 0x021BAF60> print(re.search(pattern,"M99",re.VERBOSE)) #None
(1) 緩い正規表現を使用する場合、最も重要なことは次のとおりです。追加のパラメータ re.VERBOSE を渡す必要があります。これは re モジュールの定数であり、一致する正規表現が緩い正規表現であることを示します。 。パターンのスペースとコメントは無視されますが、同時に読みやすくなります。
4 ケーススタディ: 電話番号の解析
は次の電話番号と一致する必要があります:
800-555-1212
800 555 1212
800.555.1212
(800)555-1212
1-8 00- 555 -1212
800-555-1212-1234
800-555-1212x1234
800-555-1212 内線1234
仕事1-(800) 555,1212 #1234
フォーマットの比較 必要なことはたくさんあります市外局番は 800、外線番号は 555、電話番号の他の桁は 1212 です。内線番号をお持ちの方は、内線番号が 1234 であることを知っておく必要があります
phonePattern = re.compile(r''' # don't match beginging of string (\d{3}) # 3 digits \D* #any number of non-digits (\d{3}) # 3 digits \D* #any number of non-digits (\d{4}) # 4 digits \D* #any number of non-digits (\d*) #any number of digits ''',re.VERBOSE) print(phonePattern.search('work 1-(800)555.1212 #1234').groups()) #('800', '555', '1212', '1234')
print(phonePattern.search(' work 1-(800)555.1212 # 1234').groups()) #('800', '555', '1212', '1234')
(1) 上記の緩やかな正規表現、最初に 3 桁に一致市外局番(必ずしも最初からである必要はありません。文字で始まるため、^ は使用できません)、次に任意の数の非数字文字と一致し、次に 3 つの数字のトランク番号と一致し、次に任意の数の非数字文字と一致し、次に一致します。 4 つの数字を入力し、任意の数の数字以外の文字と一致し、次に任意の数の桁の内線番号と一致し、グループ機能を使用してそれらをグループ化し、正しい電話番号を取得します。