集合知のプログラミングの本には、正規表現があります。
splitter = re.compile('\\W*')
コンテキストから、これは英数字以外の文字と一致するように見えます。しかし、バックスラッシュと 1 つ以上の W に一致するように見えるので、私は混乱しています。本当に似合うのは?
あなたの正規表現はと同等\W*
です。0 個以上の英数字以外の文字に一致します。
実際には、生の文字列ではなく、python 文字列リテラルを使用しています。\\
バックスラッシュには特別な意味があるため、Python 文字列リテラルでは、リテラルのバックスラッシュと一致させるには、バックスラッシュ - をエスケープする必要があります。そして、正規表現の場合、両方のバックスラッシュをエスケープして、 - にする必要があります\\\\
。
したがって、\
0 以上が続く場合は、文字列リテラルW
が必要になります。\\\\W*
生の文字列を使用すると、これを簡素化できます。a\\
はリテラルに一致し\
ます。これは、バックスラッシュがraw string内で使用された場合、特別な方法で処理されないためです。
以下の例は、これを理解するのに役立ちます。
>>> s = "\WWWW$$$$"
# Without raw string
>>> splitter = re.compile('\\W*') # Match non-alphanumeric characters
>>> re.findall(splitter, s)
['\\', '', '', '', '', '$$$$', '']
>>> splitter = re.compile('\\\\W*') # Match `\` followed by 0 or more `W`
>>> re.findall(splitter, s)
['\\WWWW']
# With raw string
>>> splitter = re.compile(r'\W*') # Same as first one. You need a single `\`
>>> re.findall(splitter, s)
['\\', '', '', '', '', '$$$$', '']
>>> splitter = re.compile(r'\\W*') # Same as 2nd. Two `\\` needed.
>>> re.findall(splitter, s)
['\\WWWW']
何が起こるかというと、\
文字をエスケープするのに役立ちます。そう\\
意味し\
ます。したがって、正規表現は(エスケープ後)次のようになります。
\W*
より良い代替手段は、次を使用することです。r'\W*'