2017-10-26 3 views
1

私は[^ ab]がaまたはb以外の文字を捕まえることを知りました。 [^ ab] *は、0または複数の文字と一致する必要があります。いずれもaまたはbではありません。[^ ab] *とaとは何が一致しますか?

しかし、pythonは何らかの形で[^ ab] *に一致します。

pattern = '[^ab]*' 
str = 'a' 
r = re.compile(pattern) 
m = r.match(str) 
if m is None: 
    print 'No match' 
else: 
    print 'match' 

このコードスニペットは一致を出力します。 ^の使用法を理解するのに間違っているか、コード内に何らかの誤りがあったと思われます。

+7

0文字に一致し、いずれもaまたはbではありません。 – melpomene

+0

「a」はどのようにマッチしていますか? – user3828311

+1

'*'はあなたを混乱させ、 '^'はあなたを混乱させません。 – Jason

答えて

2

[]*を意味するゼロ以上の括弧内の例です。この場合、空の文字列は文字列の一部であるため一致します。

the docセクションを参照してください。文字列の先頭でゼロ以上の文字が正規表現パターンに一致する

場合は必要になります場合は...

文字列'a'は、先頭に空の文字列''を持っています。あなたは、reg exはそれが''+'a'と見なすことができます。

おそらく、代わりにfullmatchを試してみたいです。

+0

さて、[^ ab] *がstrの空の文字列にマッチすることを理解しています。 strの 'a'と一致するもの – user3828311

+0

さて、私はマッチとフルマッチの違いを誤解していると思います。 strの任意の部分にマッチするので、完全一致はstr全体がパターンの右側に一致するようにしますか? – user3828311

+0

いいえ、 'match'は文字列の** start **と一致します。答えのドキュメントの引用符を見てください。 – gonutz

1

"a"は一致する文字列ではありません。一致する空の文字列("")です。

正規表現の*は、以前のグループが0回以上一致していることを示しています。あなたの正規表現はの0回の空の文字列と一致しています。このため、mNoneではありませんが、一致しないものとは異なる空の文字列が含まれています。

私はREPLに割り当てを書いた:ので、(あなたがm.groups()は空のタプル(それゆえではないなし)であることがわかります

>>> import re 
>>> pattern = '[^ab]*' 
>>> str = 'a' 
>>> r = re.compile(pattern) 
>>> m = r.match(str) 
>>> m.groups() 
=>() 
>>> m.group(0) 
=> '' 
>>> m.group(1) 
Traceback (most recent call last): 
    File "python", line 1, in <module> 
IndexError: no such group 

を、そしてm.group(0)pattern一致1項目を意味し、空の文字列を返しますm.group(1)は機能しません)。空の文字列です。

+と同じですが、少なくとも1回は一致します。

0

以前の回答の状態では、*正規表現はと一致します。以上が一致します。 それは難しい部分です。

あなたはいくつかのテストを行うことができ、Pythonがどのようにして*を処理するかを理解することができます。これは奇妙に思える

>>> r.match(str_).groups() 
() 

マッチオブジェクトは、グループ内のマッチを返すグループ()メソッドを有します。どうしてこれは空のグループを返しますか?これはさらに奇妙です:findallメソッドは一致するアイテムのリストを返します

>>> r.findall(str_) 
['', ''] 

2つの空の文字列。つまり、一致しない場合でも、空の項目(リスト/タプル)が表示されます。あなたは*+に(試合一つ以上)を変更した場合の結果が異なっている:

>>> pattern = '[^ab]+' 
>>> re.match(pattern, 'a').groups() 

Traceback (most recent call last): 
    File "<pyshell#135>", line 1, in <module> 
    re.match(pattern, 'a').groups() 
AttributeError: 'NoneType' object has no attribute 'groups' 

これはNoneを返します。

パターンなど[]*で使用されるときに、それをまとめるために、Pythonは、検索文字列の先頭に追加空の文字列*を扱います。ただし、パターン[]+を使用している場合は、それは行いません。

関連する問題