2012-10-22 109 views
2

我感到困惑的下面的Python正则表达式的语义:Python正则表达式( .. +)?

r"/actors(\\..+)?"

我看遍了正则表达式的Python文档部分,但不能让这种表达的意义。有人可以帮我吗?

+1

那么,一次看一件。你知道'\ .. +'作品匹配什么吗? – 2012-10-22 22:51:29

+1

见http://www.regex101.com/r/jX3tU9。 –

+0

那是我觉得困惑的部分。其余的对我来说很有意义。 –

回答

6
/  # literal/
actors # literal actors 
(  # starting a subpattern 
\\  # (escaped) literal \ 
.  # arbitrary character 
.+  # 1 or more arbitrary characters 
)?  # ends the subpattern and makes it optional 

这将意味着,它匹配正斜杠,'actors',然后可选地反斜杠和2个或更多任意字符。

我想这里有一个错字。字符串不应该被标记为raw,或者有一个反斜杠太多。在这两种情况下,都会有一个转义的.而不是转义的\,后面是任意的字符。这反过来会匹配文件,称为actors与任意或丢失的文件扩展名。

所以要么"/actors(\\..+)?"要么r"/actors(\..+)?"

+1

这是一个原始字符串,所以不需要转义反斜杠。它实际上是一个反斜杠,其后是任何字符。 –

+0

哦,对。在这种情况下,这可能是两个地方之一的拼写错误。我会补充一点。 –

-1

这意味着:字符串/actors,后跟一个可选捕获组,其中包含文字.,然后是一个或多个非文字.配置为匹配。

+0

您错过了模式是原始字符串的事实。您的答案没有考虑到这一点。 –

+0

@BryanOakley看看标题。这是模棱两可的,我已经评论过这个问题。在URL中没有反斜杠也是更有意义的(我认为这是它匹配的)。 – quantum

1
\\..+ 

这里,\\是一个转义字符\,所以它完全匹配的。以下是.,可以匹配任何字符,紧接着又.是必须有至少一次(或更频繁,所以..+将匹配两个字符以上。而\\..+将任意两个或更多字符相匹配,由前缀反斜杠

(\\..+)? 

这一切是一个可选的捕获组的内部意味着这一切可以留给了为好。

注意表达可能是错误的。它看起来好像你试图匹配某种URL并想要匹配fil e扩展名,由.字符引入。然而,原始字符串r" "中的\\将匹配\字符,并且不会逃脱该点本身。所以你可能想要r"/actors(\..+)?""/actors(\\..+)?"