4

集合知のプログラミングの本には、正規表現があります。

splitter = re.compile('\\W*')

コンテキストから、これは英数字以外の文字と一致するように見えます。しかし、バックスラッシュと 1 つ以上の W に一致するように見えるので、私は混乱しています。本当に似合うのは?

4

6 に答える 6

3

あなたの正規表現はと同等\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']
于 2013-07-17T16:04:21.180 に答える
0

何が起こるかというと、\文字をエスケープするのに役立ちます。そう\\意味し\ます。したがって、正規表現は(エスケープ後)次のようになります。

\W*

より良い代替手段は、次を使用することです。r'\W*'

于 2013-07-17T15:54:26.787 に答える