数量詞LOGIN

数量詞

さあ、引き続き正規表現について理解を深めていきましょう。このパートでは、量指定子と、量指定子を使用する理由について理解します。ちょっと考えてみましょう。数十、数百の文字を一致させたい場合は、次のようにする必要がありますか?一つずつ書く? そこで数量詞が登場しました。

量指定子の辞書は: {min,max} です。 min と max は両方とも非負の整数です。カンマが存在し、max が省略された場合、max には制限がありません。カンマと max の両方を省略した場合は、min 回繰り返します。たとえば、\b[1-9][0-9]{3}\b は 1000 ~ 9999 の数値に一致します (「\b」は単語の境界を表します)。一方、\b[1-9][0 -9]{ 2,4}\b、100 ~ 99999 の数値と一致します。

英語の文字列内の 4 ~ 7 文字と一致する以下の例を見てみましょう。

import re
a = 'java*&39android##@@python'
# 数量词
findall = re.findall('[a-z]{4,7}', a)
print(findall)

出力結果:

['java', 'android', 'python']

注意:貪欲と非貪欲。

Greedy モード: 文字列全体を一度に読み取り、一致しない場合は右端の文字を吐き出し、一致する文字が見つかるまで一致するのが特徴です。見つかりました。文字列または文字列の長さが 0 です。その目的は、できるだけ多くの文字を読み取ることであるため、最初の一致が読み取られるとすぐに戻ります。

Lazy モード: 文字列の左側から開始して、文字列内の文字を読み取らずに照合を試みるのが特徴です。失敗した場合は、もう 1 文字読んで再度照合します。このサイクルは、一致が見つかりました。一致した文字列を返し、文字列の終わりまで再度一致します。

上記の例は貪欲ですが、非貪欲モード、つまり遅延モードを使用したい場合はどうすればよいでしょうか?

non-greedy を使用する場合は、? を追加します。上記の例は次のように変更されます:

import re
a = 'java*&39android##@@python'
# 贪婪与非贪婪
re_findall = re.findall('[a-z]{4,7}?', a)
print(re_findall)

出力結果は次のとおりです:

['java', 'andr', 'pyth']

As can出力結果からわかるように、ここでは遅延モードが使用されているため、android は andr を除いてのみ印刷され、Python は pyth を除いてのみ印刷されます。

もちろん、次のような数量を表現できる特殊文字もいくつかあります。

?:告诉引擎匹配前导字符 0 次或 1 次
+:告诉引擎匹配前导字符 1 次或多次
*:告诉引擎匹配前导字符 0 次或多次

このパートの知識ポイントを要約すると、次の表になります。

#怠け者 ? ? ? 0 個または 1 回の出現。{0,1}##? に相当します。 ##**? と同等です。 ゼロ個以上の出現。{0,}ちょうど n 回発生します少なくとも n 個の分岐と m 個を超えるオカレンス少なくとも n 件発生
#貪欲 #説明
は 1 回以上出現します。これは、{1,}
##{n}{n} に相当しますか?
{n,m}{n,m}?
{n,}{n,}?


##次のセクション

コースウェア