1.看书上教材说*?是非贪婪模式,那么对于下面这段代码,为啥结果是空呢?
>>> import re
>>> line = 'cats are smart than dogs.'
>>> m=re.match(r'(.*?)',line)
>>> m.group()
结果为:''
为什么结果为空呢?不应该是cats么?难道字符串前默认有个空字符?
新手求明白人给解答下,谢谢了
大家讲道理2017-04-17 17:29:36
.
= 任意の文字 *
= 0 回以上出現 ({0,}
?
と同等) = 以前の一致が最も少ない文字を取得します ({0,1}
<🎜 と同等) >
と一致させるには、cats
、cats
の後にスペースを使用する必要があります。 r'(.*?) '
高洛峰2017-04-17 17:29:36
私の個人的な理解では、.*?
は開始位置である ^
と一致します。正規表現では、次のように位置も一致します。
リーリー
を置き換えます。また、同じことが ^
にも当てはまります。そのため、$
は .*?
と直接一致します。^
PS: 正規表現を使用する場合、特にテキスト コンテンツが多い場合
の使用は推奨されませんが、.*
や [sS]*
など [dD]*
高洛峰2017-04-17 17:29:36
正規表現の貪欲マッチングと非貪欲マッチングの違いは次のとおりです。
Greedy モード: マッチングが可能な場合、 の最も長い をマッチングします。式は ?
で終わりません。
Non-greedy モード: マッチング可能な場合、 の最短の をマッチングします。式は ?
で終わります。
たとえば、文字列 abcabcabc
で、a
で始まり c
で終わる文字列と一致させたい場合、abc
、abcabc
、abcabcabc
の 3 つの一致があります。最も長い abcabcabc
は a.*c
と照合でき、最も短い abc
は a.*?c
と照合できます。
結果が空なのはなぜですか?猫じゃなくてもいいのでは?
.*
は貪欲パターンであるため、各文字が任意の文字である最長の文字列 (.
)、つまりすべての入力文字で構成される文字列と一致します。 .*?
は非貪欲モードで、各文字が任意の文字 (.
) である最短の文字列、つまり空の文字列と一致します。
猫という単語に一致させたい場合は、cats
を使用する必要があります。入力文字列の最初の単語と一致させたい場合は、w+
または S+
を使用する必要があります。
デフォルトでは文字列の前にヌル文字がありますか?
いいえ、ただし、正規表現では、^
を使用して文字列の開始位置を表し、$
を使用して終了位置を表すことができます。これら 2 つの文字 (^
と $
) は、マッチング ルールで指定された記号であり、作成するルール文字列で使用されます。これは、マッチングされる文字列にこれら 2 つの記号が含まれることを意味するものではありません。