对正则表达感到困惑

时间:2013-07-17 15:48:30

标签: python regex

在“编程集体智慧”一书中,有一个正则表达式,

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

从上下文看,它与任何非字母数字字符匹配。但我很困惑,因为它似乎匹配一个反斜杠,然后一个或多个W。它真正匹配的是什么?

6 个答案:

答案 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*'

注意开头的rraw 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*')