數(shù)量詞
さあ、引き続き正規(guī)表現(xiàn)について理解を深めていきましょう。このパートでは、量指定子と、量指定子を使用する理由について理解します。ちょっと考えてみましょう。數(shù)十、數(shù)百の文字を一致させたい場(chǎng)合は、次のようにする必要がありますか?一つずつ書く? そこで數(shù)量詞が登場(chǎng)しました。
量指定子の辭書は: {min,max} です。 min と max は両方とも非負(fù)の整數(shù)です。カンマが存在し、max が省略された場(chǎng)合、max には制限がありません。カンマと max の両方を省略した場(chǎng)合は、min 回繰り返します。たとえば、\b[1-9][0-9]{3}\b は 1000 ~ 9999 の數(shù)値に一致します (「\b」は単語(yǔ)の境界を表します)。一方、\b[1-9][0 -9]{ 2,4}\b、100 ~ 99999 の數(shù)値と一致します。
英語(yǔ)の文字列內(nèi)の 4 ~ 7 文字と一致する以下の例を見(jiàn)てみましょう。
import re a = 'java*&39android##@@python' # 數(shù)量詞 findall = re.findall('[a-z]{4,7}', a) print(findall)
出力結(jié)果:
['java', 'android', 'python']
注意:貪欲と非貪欲。
Greedy モード: 文字列全體を一度に読み取り、一致しない場(chǎng)合は右端の文字を吐き出し、一致する文字が見(jiàn)つかるまで一致するのが特徴です。見(jiàn)つかりました。文字列または文字列の長(zhǎng)さが 0 です。その目的は、できるだけ多くの文字を読み取ることであるため、最初の一致が読み取られるとすぐに戻ります。
Lazy モード: 文字列の左側(cè)から開(kāi)始して、文字列內(nèi)の文字を読み取らずに照合を試みるのが特徴です。失敗した場(chǎng)合は、もう 1 文字読んで再度照合します。このサイクルは、一致が見(jiàn)つかりました。一致した文字列を返し、文字列の終わりまで再度一致します。
上記の例は貪欲ですが、非貪欲モード、つまり遅延モードを使用したい場(chǎng)合はどうすればよいでしょうか?
non-greedy を使用する場(chǎng)合は、? を追加します。上記の例は次のように変更されます:
import re a = 'java*&39android##@@python' # 貪婪與非貪婪 re_findall = re.findall('[a-z]{4,7}?', a) print(re_findall)
出力結(jié)果は次のとおりです:
['java', 'andr', 'pyth']
As can出力結(jié)果からわかるように、ここでは遅延モードが使用されているため、android は andr を除いてのみ印刷され、Python は pyth を除いてのみ印刷されます。
もちろん、次のような數(shù)量を表現(xiàn)できる特殊文字もいくつかあります。
?:告訴引擎匹配前導(dǎo)字符 0 次或 1 次 +:告訴引擎匹配前導(dǎo)字符 1 次或多次 *:告訴引擎匹配前導(dǎo)字符 0 次或多次
このパートの知識(shí)ポイントを要約すると、次の表になります。
#貪欲 | #怠け者#説明 | ? |
0 個(gè)または 1 回の出現(xiàn)。{0,1} | ||
は 1 回以上出現(xiàn)します。これは、{1,} | ##* | *? と同等です。 |
##{n} | {n} に相當(dāng)しますか? | |
{n,m} | {n,m}? | |
{n,} | {n,}? | |
##