1

誰かがこの正規表現がどのように機能するかを説明してもらえますか?

^(a)|\1$

私はそれを次のように解釈します:

*1。文字列の開始、

に続く:

*2。また:

*2a。、a_

また:

*2b。以前に一致した(a)グループ、

に続く:

*3。文字列の終わり

(a)ただし、 2aよりも2bを選択した場合、以前に一致したグループがないため、2bは不可能です。したがって、解釈は次のようになります。

*1。文字列の開始、

に続く:

*2。、a_

に続く:

*3。文字列の終わり

言い換えれば、その正規表現はちょうど:( ^a$ORされた後方参照は無意味であると言うこともできます)と同等です。

しかし、Pythonでは次のようになります。

>>> import re

>>> re.findall(r'^a$', r'aa')
[] # as expected

>>> re.findall(r'^(a)|\1$', r'a')
['a'] # as expected

>>> re.findall(r'^(a)|\1$', r'aa')
['a'] # NOT as expected

どうすればaa一致することができ^(a)|\1$ますか?

4

1 に答える 1

0

これは、実際には到達不能な正規表現コードの場合です。

原則として、これaは行頭のシングル、または行頭のシングルがすでに一致しているa場合に限り、行末のシングルのいずれかに一致します。ただし、行頭のa単一の一致は一致がすでに行われていることを意味するため、正規表現の 2 番目の部分に到達することはなく、最初の部分だけが常に返されます。aa

具体的には「a」だけでなく、より複雑なグループがあると思います。そのため、フレーズa、a second a(オプション)、および行末に一致するものを次に示します。^(a)\1?$

つまり、「a行の先頭で一致し、そこにある場合は別の foo を許可し、次に文字列の末尾を許可します。ここでaは、任意の正規表現パターンにすることができます。a本当に文字「a」だけの場合^aa?$は、より簡単な代替手段です.

aで始まるまたは終わる行全体に一致させたいだけの場合は^(a.*|.*a)$機能^(a[^\n]*|[^\n]*a)$します。単一行モードを使用している場合は、演算子^(a.*?|.*?a)$をサポートする正規表現フレーバーのように単純化されます。*?残念ながら、この場合、a後方参照ではうまくいかないため、パターン全体の最初と最後に のパターンを記述する必要があります。a演算子を含むパターンの場合は、 の|ように括弧で囲みます^((a).*|.*(a))$

于 2013-10-20T19:33:35.623 に答える