2013-07-17 69 views
4

在這本書編程集體智慧有一個正則表達式,困惑正則表達式

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

從上下文中它看起來像這樣匹配任何非字母數字字符。但我很困惑,因爲它看起來像匹配反斜槓,然後是一個或多個W。它真的匹配了什麼?

+1

[Python的re模塊(http://docs.python.org/2/library/re.html) –

回答

3

你的正則表達式等同於\W*。它匹配0個或更多非字母數字字符。

實際上,您使用python字符串而不是原始字符串。在Python字符串文字中,爲了匹配文字反斜槓,您需要跳過反斜槓 - \\,因爲反斜槓在那裏有特殊含義。然後對於正則表達式,你需要逃避兩個反斜槓,使其成爲 - \\\\

所以,匹配\其次是0個或多個W,你需要在一個字符串\\\\W*。您可以通過使用原始字符串來簡化此操作。其中\\將與文字\匹配。這是因爲,在原始字符串中使用反斜槓時,不會以任何特殊方式處理。

下面的例子將幫助你理解這一點:

>>> 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'] 
+0

感謝這個例子! –

+0

@ilovestackoverflow。別客氣 :) –

-1

該正則表達式將匹配反斜槓和零個或多個W。如果要匹配零個或多個非單詞字符:

splitter = re.compile(r'\W*') 
+0

我認爲你需要的任何r之前的字符串或第二個反斜槓逃脫序列... –

+0

我已經修復了這一點,感謝捕捉。 – mattexx

0

這符合非單詞字符,這意味着非字母數字或下劃線。這編譯成\ W這是\ w的否定版本,其中\ w匹配任何單詞字符。

因此,您認爲它與非字母數字匹配是正確的。

有關特殊正則表達式字符的參考,你可以看看這裏。 http://www.regular-expressions.info/reference.html

2

對於沒有正則表達式(例如:Java)的良好字符串表示形式的編程語言,第一個反斜槓就像轉義字符一樣。在Python中,你可以做的更好,這相當於:

r'\W*' 

通知的r開頭(一raw string),呈現不必要使用第一\轉義字符。第二個\是不可避免的,這是字符類的一部分\W

1

\是正則表達式中的轉義字符。從左到右,\\表示\,然後是\w*,所以它表示匹配任何非數字和下劃線字符。在這種情況下,如果你想要一個\,你必須寫\\\\。如果你想讓正則表達式更清晰簡單,你可以使用r'\W*'r表示原始字符串,並且可以讓您編寫較少的\

0

會發生什麼,\有助於轉義角色。所以\\意味着\。所以您正則表達式(後逃逸)變爲:

\W* 

一個更好的替代方法是使用:r'\W*'

+0

這在原始字符串中是正確的。在普通的字符串文字中,你需要4個 - '「\\\\」' –

+0

所以這意味着如果我想匹配一個數字,我會使用\\ d –