数量詞
さあ、引き続き正規表現について理解を深めていきましょう。このパートでは、量指定子と、量指定子を使用する理由について理解します。ちょっと考えてみましょう。数十、数百の文字を一致させたい場合は、次のようにする必要がありますか?一つずつ書く? そこで数量詞が登場しました。
量指定子の辞書は: {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} | ||
は 1 回以上出現します。これは、{1,} | ##* | *? と同等です。 |
##{n} | {n} に相当しますか? | |
{n,m} | {n,m}? | |
{n,} | {n,}? | |
##