ホームページ  >  記事  >  バックエンド開発  >  Python の正規表現

Python の正規表現

高洛峰
高洛峰オリジナル
2016-10-19 16:37:061246ブラウズ

正規表現は、複雑な文字列を検索、置換、解析するための強力で標準的な方法です。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, &#39;DejaVu Sans Mono&#39;, &#39;Bitstream Vera Sans Mono&#39;, Consolas, &#39;Courier New&#39;, 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&#39;&#39;&#39;
    # don&#39;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
&#39;&#39;&#39;,re.VERBOSE)
print(phonePattern.search(&#39;work 1-(800)555.1212 #1234&#39;).groups()) #(&#39;800&#39;, &#39;555&#39;, &#39;1212&#39;, &#39;1234&#39;)

print(phonePattern.search(' work 1-(800)555.1212 # 1234').groups()) #('800', '555', '1212', '1234')

(1) 上記の緩やかな正規表現、最初に 3 桁に一致市外局番(必ずしも最初からである必要はありません。文字で始まるため、^ は使用できません)、次に任意の数の非数字文字と一致し、次に 3 つの数字のトランク番号と一致し、次に任意の数の非数字文字と一致し、次に一致します。 4 つの数字を入力し、任意の数の数字以外の文字と一致し、次に任意の数の桁の内線番号と一致し、グループ機能を使用してそれらをグループ化し、正しい電話番号を取得します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。