web-dev-qa-db-ja.com

Python regex Escape operator \)

RAW文字列のR 'とともに、python Regexの機能の機能内のロジックはわかりません。いくつかの助けが高く評価されています。

コード:

_import re
text=' esto  .es  10  . er - 12 .23 with [  and.Other ] here is more ; puntuation'
print('text0=',text)
text1 = re.sub(r'(\s+)([;:\.\-])', r'\2', text)
text2 = re.sub(r'\s+\.', '\.', text)
text3 = re.sub(r'\s+\.', r'\.', text)
print('text1=',text1)
print('text2=',text2)
print('text3=',text3)
_

この理論は、特別な形式を示すために、バックスラッシュ文字( '\')、または特別な意味を呼び起こすことなく特殊文字を使用できるようにします。

そして、この質問の終わりに提供されているリンクが説明している限り、R 'は生の文字列を表します、すなわちシンボルに特別な意味はありません、それはそれが存在するのと同じです。

そのため、上記の正規表現では、代替テキストが「」であるため、Text2とText3が異なると予想されます。テキスト2では、すなわち(原則として)テキスト3の置換テキストはR 'である。それは生の文字列、すなわちそれが現れるべきである文字列、バックスラッシュと期間です。しかし彼らは同じことをもたらします:

結果は次のとおりです。

_text0=  esto  .es  10  . er - 12 .23 with [  and.Other ] here is more ; puntuation
text1=  esto.es  10. er- 12.23 with [  and.Other ] here is more; puntuation
text2=  esto\.es  10\. er - 12\.23 with [  and.Other ] here is more ; puntuation
text3=  esto\.es  10\. er - 12\.23 with [  and.Other ] here is more ; puntuation
#text2=text3 but substitutions are not the same r'\.' vs '\.'
_

R 'が置換部分でも同じ方法でもバックスラッシュでも動作しません。その一方で、私の直感は私にここに何かを欠けていると言っています。

編集1:次の@WiktorStribiłewのコメント。彼はそれを指摘した(彼のリンクに続く):

_import re
print(re.sub(r'(.)(.)(.)(.)(.)(.)', 'a\6b', '123456'))
print(re.sub(r'(.)(.)(.)(.)(.)(.)', r'a\6b', '123456'))
# in my example the substitutions were not the same and the result were equal
# here indeed r' changes the results
_

これは次のようになります。

_ab
a6b
_

それは私をもっとパズルします。

注: これは STACKオーバーフローSuper Completeの生の文字列に関する質問をスタックします。それにもかかわらず、それは代用について話さない

12
JFerro

から doc (私の強調):

rES(パターン、REPL、STRING、COUNT = 0、FLAGS = 0)は、ストリング内の左端の非重複していないパターンの発生を文字列で置き換えて返します。パターンが見つからない場合、文字列は変更されずに返されます。 REPLは文字列または関数です。文字列の場合は、バックスラッシュエスケープが処理されます。つまり、\ Nは単一の改行文字に変換され、\ Rはキャリッジリターンに変換されます。 ASCII文字の不明なエスケープは将来の使用のために予約されており、エラーとして扱われます。 その他の未知のエスケープなどの\&左中左側のエスケープ。\ 6のような基板6は、パターンのグループ6で一致する部分文字列に置き換えられます。

repl引数は単なるテキストだけではありません。また、関数の名前であるか、グループ内の位置(例えば、\g<quote>\g<1>\1)を参照することもできます。

また、から こちら

標準Cとは異なり、すべての認識されていないエスケープシーケンスは文字列に変更されず、すなわちバックスラッシュが残ります。

.は特殊エスケープ文字ではないので、'\.'r'\.\と同じです。

2
cdarke