在這本書編程集體智慧有一個正則表達式,困惑正則表達式
splitter = re.compile('\\W*')
從上下文中它看起來像這樣匹配任何非字母數字字符。但我很困惑,因爲它看起來像匹配反斜槓,然後是一個或多個W。它真的匹配了什麼?
在這本書編程集體智慧有一個正則表達式,困惑正則表達式
splitter = re.compile('\\W*')
從上下文中它看起來像這樣匹配任何非字母數字字符。但我很困惑,因爲它看起來像匹配反斜槓,然後是一個或多個W。它真的匹配了什麼?
你的正則表達式等同於\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']
感謝這個例子! –
@ilovestackoverflow。別客氣 :) –
該正則表達式將匹配反斜槓和零個或多個W。如果要匹配零個或多個非單詞字符:
splitter = re.compile(r'\W*')
我認爲你需要的任何r之前的字符串或第二個反斜槓逃脫序列... –
我已經修復了這一點,感謝捕捉。 – mattexx
這符合非單詞字符,這意味着非字母數字或下劃線。這編譯成\ W這是\ w的否定版本,其中\ w匹配任何單詞字符。
因此,您認爲它與非字母數字匹配是正確的。
有關特殊正則表達式字符的參考,你可以看看這裏。 http://www.regular-expressions.info/reference.html
對於沒有正則表達式(例如:Java)的良好字符串表示形式的編程語言,第一個反斜槓就像轉義字符一樣。在Python中,你可以做的更好,這相當於:
r'\W*'
通知的r
開頭(一raw string),呈現不必要使用第一\
轉義字符。第二個\
是不可避免的,這是字符類的一部分\W
\
是正則表達式中的轉義字符。從左到右,\\
表示\
,然後是\w*
,所以它表示匹配任何非數字和下劃線字符。在這種情況下,如果你想要一個\
,你必須寫\\\\
。如果你想讓正則表達式更清晰簡單,你可以使用r'\W*'
。 r
表示原始字符串,並且可以讓您編寫較少的\
。
會發生什麼,\
有助於轉義角色。所以\\
意味着\
。所以您正則表達式(後逃逸)變爲:
\W*
一個更好的替代方法是使用:r'\W*'
這在原始字符串中是正確的。在普通的字符串文字中,你需要4個 - '「\\\\」' –
所以這意味着如果我想匹配一個數字,我會使用\\ d –
[Python的re模塊(http://docs.python.org/2/library/re.html) –