ホームページ  >  記事  >  バックエンド開発  >  Pythonの正規表現を学ぶにはどうすればよいですか?

Pythonの正規表現を学ぶにはどうすればよいですか?

零下一度
零下一度オリジナル
2017-07-03 15:21:521195ブラウズ

re モジュールは、完全な 正規表現 機能を Python 言語にもたらします。

compile 関数は、パターン string とオプションのフラグ引数に基づいて 正規表現オブジェクト を生成します。このオブジェクトには、正規表現の一致と置換のための一連のメソッドがあります。

re.match(pattern, string, flags=0) # 匹配成功返回一个匹配的对象,否则返回none
1 import re2 print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配 (0, 3)3 print(re.match('com', 'www.runoob.com'))        # 不在起始位置匹配 None
 1 import re 2 line = "cats are smarter than dogs" 3 matchObj = re.match(r'(.*) are (.*?) .*', line, re.M|re.I) 4 # matchObj = re.match(r'(.*) are (.*) .*', line, re.M|re.I)  # 结果也一样 5  6 if matchObj: 7     print("matchObj.group()", matchObj.group())     # cats are smarter than dogs 8     print("matchObj.group(1)", matchObj.group(1))   # cats 9     print("matchObj.group(2)", matchObj.group(2))   # smarter10 else:11     print("No match!!")
 1 import re 2 line = "cats are smarter than dogs" 3 matchObj = re.match(r'(.*) are (.*?) (.*) .*', line, re.M|re.I) 4 # matchObj = re.match(r'(.*) are (.*) (.*) .*', line, re.M|re.I)  #这个结果也一样  5  6 if matchObj: 7     print("matchObj.group()", matchObj.group())     # cats are smarter than dogs 8     print("matchObj.group(1)", matchObj.group(1))   # cats 9     print("matchObj.group(2)", matchObj.group(2))   # smarter10     print("matchObj.group(3)", matchObj.group(3))   # than11 else:12     print("No match!!")

group(num) または groups() 一致オブジェクト関数を使用して、一致式を取得します。

groups(): 1 から に含まれるグループ番号までのすべてのグループ文字列を含むタプルを返します。

re.search は文字列全体をスキャンし、最初に一致したものを返します。

print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配  (0, 3)print(re.search('com', 'www.runoob.com').span())  # 不在起始位置匹配  (11, 14)
1 import re2 line = "Cats are smarter than dogs";3 searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)4 if searchObj:5     print("searchObj.group() : ", searchObj.group())     # Cats are smarter than dogs   6     print("searchObj.group(1) : ", searchObj.group(1))   # Cats7     print("searchObj.group(2) : ", searchObj.group(2))   # smarter8 else:9     print("Nothing found!!")
 1 line = "Cats are smarter than dogs" 2 matchObj = re.match(r'dogs', line, re.M | re.I) 3 if matchObj: 4     print("match --> matchObj.group() : ", matchObj.group()) 5 else: 6     print("No match!!") 7  8 matchObj = re.search(r'dogs', line, re.M | re.I) 9 if matchObj:10     print("search --> matchObj.group() : ", matchObj.group())11 else:12     print("No match!!")13 '''14 No match!!15 search --> matchObj.group() :  dogs16 '''

re.match は文字列の先頭のみと一致しますが、文字列の先頭が正規表現と一致しない場合、関数は None を返しますが、re.search は一致するものが見つかるまで文字列全体を照合します。

1 re.search(pattern, string, flags=0)2 re.sub(pattern, repl, string, count=0, flags=0)

re モジュールは、文字列内の一致を置換するための re.sub を提供します。

パラメータ:

  • pattern: 正規表現のパターン文字列。

  • repl: 置換される文字列は関数にすることもできます。

  • string : 検索および置換される元の文字列。

  • count: パターン マッチング後の置換の最大数は 0 で、これはすべての一致を置換することを意味します。


1 phone = "2004-959-559 # 国外电话号码"2 # 删除字符串中的Python注释3 num = re.sub(r'#.*$', "", phone)4 print("电话号码是:", num)        # 电话号码是: 2004-959-559 5 6 # 删除非数字(-)的字符串7 num = re.sub(r'\D', "", phone)8 print("电话号码是:", num)        # 电话号码是: 2004959559
replパラメータは関数です

1 # 将匹配的数字乘于22 def double(matched):3     value = int(matched.group('value'))4     return str(value * 2)5 6 s = 'A23G4HFD567'7 print(re.sub('(?P<value>\d+)', double, s))
re.I大文字と小文字を区別せずに一致させますre.Lロケールを意識したマッチングを行いますリ。 re.X

re.I | re.M... 複数のフラグをビット単位の OR (|) で指定できます。

正規表現パターン

パターン文字列は、特別な構文を使用して正規表現を表します。文字と数字はそれ自体を表します。

文字を解析します。このフラグは、w、W、b、B に影響します。
このフラグにより​​、より柔軟な形式が提供されるため、正規表現の記述が容易になります。
^ は文字列の先頭と一致します
$ は文字列の末尾と一致します。
. は、改行文字を除く任意の文字に一致します。 re.DOTALL フラグが指定されている場合、改行文字を含む任意の文字に一致します。
[...] は、個別にリストされた文字のグループを表すために使用されます: [amk] は、'a'、'm'、または 'k' に一致します
[^...] 存在しません [] 内の文字: [^abc] は、a、b、c 以外の文字と一致します。
re* は 0 個以上の式と一致します。
re+ は 1 つ以上の式と一致します。
re? 貪欲でない方法で、前の正規表現で定義された 0 または 1 個のフラグメントと一致します
re{ n}
re{ n,} 前の正規表現と完全に一致します。
re{ n, m} は、前の正規表現で定義されたフラグメントの n 倍から m 倍の貪欲な方法で一致します
a b は a または b と一致します
(re) G は括弧内の式と一致し、グループ
(?imx) も表します。正規表現には、i、m、または x の 3 つのオプションのフラグが含まれます。括弧内の領域にのみ影響します。
(?-imx) i、m、または x のオプションのフラグをオフにする正規表現。括弧内の領域にのみ影響します。
(?: re) Like (...) ですが、グループを表しません
(?imx: re) 括弧内に i、m、または x のオプションのフラグを使用します
(?-imx: re) かっこ内の i、m、x のオプションのフラグは使用しないでください
(?#...) Comments.
(?= re) Forward正の区切り文字。 ... で示される、含まれている正規表現が現在の位置と正常に一致する場合は成功し、そうでない場合は失敗します。しかし、含まれている式が試行されると、マッチング エンジンはまったく改善されず、パターンの残りの部分は依然として区切り文字の右側を試行する必要があります。
(?! re) 前方負の区切り文字。正の区切り文字とは反対に、含まれる式が文字列の現在位置で一致しない場合に成功します
(?> re) 独立したパターンが一致したため、バックトラッキングの必要がなくなります。
w は英数字とアンダースコアに一致します
W は英数字以外とアンダースコアに一致します
s は[tnrf]に相当する任意の空白文字に一致します
S の試合空でない文字
d は、[0-9]に相当する任意の数値と一致します。
D は、数値以外の任意の文字と一致します
A は、文字列の先頭と一致します
Z は文字列の末尾に一致します。改行がある場合は、改行の前の文字列の末尾のみが一致します。 c
z は文字列の末尾に一致します
G は最後の一致が完了した位置に一致します。
b は、単語とスペースの間の位置を指す単語境界に一致します。たとえば、「erb」は「never」の「er」と一致しますが、「verb」の「er」とは一致しません。
B 単語以外の境界と一致します。 「erB」は「動詞」の「er」と一致しますが、「never」の「er」とは一致しません。
n、t など。 は改行文字と一致します。タブ文字と一致します。 n 番目のグループのコンテンツと一致するまで
1...9 を待ちます。
10 は、n 番目のグループの内容が一致する場合、その内容と一致します。それ以外の場合は、8 進数の文字コードの表現を指します。

1. 文字の一致

python は「python」と一致します。

2. 文字クラス

[Pp]ythonr ub [ye][aeiou][0-9][^aeiou][^0-9]

3. 特殊文字クラス

は「Python」または「python」と一致します
は「ruby」または「rube」と一致します
は角括弧内の任意の文字と一致します
は任意の数字と一致します。 [0123456789]に類似& ; 数字
aeiou 文字を除くすべての文字
は数字を除く文字と一致します
. 「n」を除く任意の 1 文字と一致します。 「n」を含む任意の文字と一致するには、「[.n]」のようなパターンを使用します。
d は数字と一致します。 [0-9]に相当します。
D は、数字以外の文字と一致します。 [^0-9] と同等。
s は、スペース、タブ、フォーム フィードなどを含む任意の空白文字と一致します。 【fnrtv】に相当。
S は、空白以外の文字と一致します。 [^ fnrtv] に相当します。
w は、アンダースコアを含む任意の単語文字に一致します。 「[A-Za-z0-9_]」と同等。
W は、単語以外の文字と一致します。 「[^A-Za-z0-9_]」と同等。

r は、文字列がエスケープされていない生の文字列であることを示し、コンパイラーがバックスラッシュ、つまりエスケープ文字を無視できるようにします。

(.*)最初に一致するグループ * は、改行文字を除くすべての文字と一致することを意味します。

(.*?) 2 番目の一致グループ *? に続く複数の疑問符は、非貪欲モードを表します。つまり、条件を満たす最小限の文字のみが一致します。

最後の .* は一致しません。括弧で囲まれているため、グループ化ではなく、一致します。効果は最初のものと同じですが、一致結果には含まれません。

以上がPythonの正規表現を学ぶにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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