python中正则表达式*?的一个问题
PHP中文网
PHP中文网 2017-04-17 17:27:36
0
4
760

1.看书上教材说*?是非贪婪模式,那么对于下面这段代码,为啥结果是空呢?

>>> import re
>>> line = 'cats are smart than dogs.'
>>> m=re.match(r'(.*?)',line)
>>> m.group()

结果为:''
为什么结果为空呢?不应该是cats么?难道字符串前默认有个空字符?
新手求明白人给解答下,谢谢了

PHP中文网
PHP中文网

认证0级讲师

全員に返信(4)
大家讲道理

. = 任意の文字
* = 0 回以上出現 ({0,}
? と同等) = 以前の一致が最も少ない文字を取得します ({0,1}

結論から言えば「どのキャラも出現回数0回」ということなので何もありません。

と一致させるには、catscats の後にスペースを使用する必要があります。 r'(.*?) '

いいねを押す +0
小葫芦

私の個人的な理解では、.*? は開始位置である ^ と一致します。正規表現では、次のように位置も一致します。 リーリー

この例は

を置き換えます。また、同じことが ^ にも当てはまります。そのため、$.*? と直接一致します。^PS: 正規表現を使用する場合、特にテキスト コンテンツが多い場合
の使用は推奨されませんが、.*[sS]* など [dD]*

いいねを押す +0
小葫芦

正規表現の貪欲マッチングと非貪欲マッチングの違いは次のとおりです。

  • Greedy モード: マッチングが可能な場合、 の最も長い をマッチングします。式は ? で終わりません。

  • Non-greedy モード: マッチング可能な場合、 の最短の をマッチングします。式は ? で終わります。

たとえば、文字列 abcabcabc で、a で始まり c で終わる文字列と一致させたい場合、abcabcabcabcabcabc の 3 つの一致があります。最も長い abcabcabca.*c と照合でき、最も短い abca.*?c と照合できます。

リーリー

結果が空なのはなぜですか?猫じゃなくてもいいのでは?

.* は貪欲パターンであるため、各文字が任意の文字である最長の文字列 (.)、つまりすべての入力文字で構成される文字列と一致します。 .*? は非貪欲モードで、各文字が任意の文字 (.) である最短の文字列、つまり空の文字列と一致します。

猫という単語に一致させたい場合は、cats を使用する必要があります。入力文字列の最初の単語と一致させたい場合は、w+ または S+ を使用する必要があります。

リーリー

デフォルトでは文字列の前にヌル文字がありますか?

いいえ、ただし、正規表現では、^ を使用して文字列の開始位置を表し、$ を使用して終了位置を表すことができます。これら 2 つの文字 (^$) は、マッチング ルールで指定された記号であり、作成するルール文字列で使用されます。これは、マッチングされる文字列にこれら 2 つの記号が含まれることを意味するものではありません。

いいねを押す +0
黄舟

. 境界マッチングは、一致した文字列内の文字を消費せず、非貪欲モードであるため、文字列

は一致できません。
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート