web-dev-qa-db-ja.com

Python regex-rプレフィックス

rプレフィックスが使用されていない場合、以下の例1が機能する理由を説明できますか?エスケープシーケンスを使用する場合は常に、rプレフィックスを使用する必要があると考えました。例2と例3はこれを示しています。

# example 1
import re
print (re.sub('\s+', ' ', 'hello     there      there'))
# prints 'hello there there' - not expected as r prefix is not used

# example 2
import re
print (re.sub(r'(\b\w+)(\s+\1\b)+', r'\1', 'hello     there      there'))
# prints 'hello     there' - as expected as r prefix is used

# example 3
import re
print (re.sub('(\b\w+)(\s+\1\b)+', '\1', 'hello     there      there'))
# prints 'hello     there      there' - as expected as r prefix is not used
64
JT.

なぜなら\エスケープシーケンスが有効なエスケープシーケンスである場合にのみ、エスケープシーケンスを開始します。

>>> '\n'
'\n'
>>> r'\n'
'\\n'
>>> print '\n'


>>> print r'\n'
\n
>>> '\s'
'\\s'
>>> r'\s'
'\\s'
>>> print '\s'
\s
>>> print r'\s'
\s

nless 接頭辞 'r'または 'R'が存在する場合、文字列内の エスケープシーケンス は、標準Cで使用されるルールと同様のルールに従って解釈されます。認識されるエスケープシーケンスは次のとおりです。

Escape Sequence   Meaning Notes
\newline  Ignored  
\\    Backslash (\)    
\'    Single quote (')     
\"    Double quote (")     
\a    ASCII Bell (BEL)     
\b    ASCII Backspace (BS)     
\f    ASCII Formfeed (FF)  
\n    ASCII Linefeed (LF)  
\N{name}  Character named name in the Unicode database (Unicode only)  
\r    ASCII Carriage Return (CR)   
\t    ASCII Horizontal Tab (TAB)   
\uxxxx    Character with 16-bit hex value xxxx (Unicode only) 
\Uxxxxxxxx    Character with 32-bit hex value xxxxxxxx (Unicode only) 
\v    ASCII Vertical Tab (VT)  
\ooo  Character with octal value ooo
\xhh  Character with hex value hh

未加工の文字列には、お尻に噛まれた人がいることが知られているかなりのpeculiar内部動作があるため、パスリテラルに未加工の文字列に決して依存しないでください:

「r」または「R」のプレフィックスが存在する場合、バックスラッシュに続く文字は変更せずに文字列に含まれ、すべてのバックスラッシュは文字列に残ります。たとえば、文字列リテラルr"\n"は、バックスラッシュと小文字の「n」の2文字で構成されます。文字列の引用符は円記号でエスケープできますが、文字列には円記号が残ります。例えば、 r"\""は、2つの文字で構成される有効な文字列リテラルです。バックスラッシュと二重引用符。 r"\"は有効な文字列リテラルではありません(生の文字列でも奇数のバックスラッシュで終了することはできません)。具体的には、生の文字列を単一のバックスラッシュで終わらせることはできません(バックスラッシュは次の引用文字をエスケープするため)。また、改行が続く単一のバックスラッシュは、行の継続としてではなく、文字列の一部としてこれらの2文字として解釈されることに注意してください。

この最後のポイントをよりよく説明するには:

>>> r'\'
SyntaxError: EOL while scanning string literal
>>> r'\''
"\\'"
>>> '\'
SyntaxError: EOL while scanning string literal
>>> '\''
"'"
>>> 
>>> r'\\'
'\\\\'
>>> '\\'
'\\'
>>> print r'\\'
\\
>>> print r'\'
SyntaxError: EOL while scanning string literal
>>> print '\\'
\
69
Esteban Küber

バックスラッシュを含むすべてのシーケンスがエスケープシーケンスではありません。 \tおよび\fは、たとえば、しかし\sは違います。未生の文字列リテラルでは、\エスケープシーケンスの一部ではないものは、単なる別の\

>>> "\s"
'\\s'
>>> "\t"
'\t'

\bisエスケープシーケンスですが、例3は失敗します。 (そして、はい、一部の人々はこの行動をかなり不幸だと考えています。)

5
Thomas Wouters

それを試してください:

a = '\''
'
a = r'\''
\'
a = "\'"
'
a = r"\'"
\'
0
user2856064