在“编程集体智慧”一书中,有一个正则表达式,
splitter = re.compile('\\W*')
从上下文看,它与任何非字母数字字符匹配。但我很困惑,因为它似乎匹配一个反斜杠,然后一个或多个W。它真正匹配的是什么?
答案 0 :(得分: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']
答案 1 :(得分:2)
第一个反斜杠就像一个转义字符,对于那些没有正则表达式的良好字符串表示的编程语言(例如:Java)。在Python中你可以做得更好,这是等价的:
r'\W*'
注意开头的r
(raw string),这使得不必使用第一个\
转义字符。第二个\
是不可避免的,它是角色类\W
答案 2 :(得分:1)
\
是正则表达式中的转义字符。从左到右,\\
表示\
,然后表示\w*
,因此表示匹配任何非数字加下划线字符。在这种情况下,如果您想要\
,则必须编写\\\\
。如果您希望正则表达式更清晰简单,可以使用r'\W*'
。 r
表示原始字符串,可以让您少写\
。
答案 3 :(得分:0)
这匹配非单词字符,表示不是字母数字或下划线。这将编译成\ W,它是\ w的否定版本,其中\ w匹配任何单词字符。
所以你认为它与非字母数字匹配是正确的。
有关特殊正则表达式字符的参考,请查看此处。 http://www.regular-expressions.info/reference.html
答案 4 :(得分:0)
\
有助于逃避角色。因此\\
表示\
。所以你的正则表达式成为(逃脱后):
\W*
更好的选择是使用:r'\W*'
答案 5 :(得分:-1)
该正则表达式将匹配反斜杠和零个或多个W。如果要匹配零个或多个非单词字符:
splitter = re.compile(r'\W*')