Python re.match不够严格

时间:2015-09-01 14:58:03

标签: python regex

我有理解正则表达式匹配的问题。简而言之,这个小脚本会给出错误的结果。

在:

#!/usr/bin/env python

import re

base = '/show/summer/2015/party/my_brand/'

pt1 = '^/show/(?P<season>.+)/(?P<year>[0-9]+)/(?P<type>.+)/(?P<brand>.+)/$'
pt2 = '^/show/(?P<season>.+)/(?P<year>[0-9]+)/(?P<type>.+)/$'


print base, '==', pt1, re.match(pt1, base) is not None
print base, '==', pt2, re.match(pt2, base) is not None

输出:

/show/summer/2015/party/my_brand/ == ^/show/(?P<season>.+)/(?P<year>[0-9]+)/(?P<type>.+)/(?P<brand>.+)/$ True
/show/summer/2015/party/my_brand/ == ^/show/(?P<season>.+)/(?P<year>[0-9]+)/(?P<type>.+)/$ True

显然我期待只有匹配的pt1。我很确定我的模式是错的,我应该改变一些事情来变得更贪婪(在这里猜测)。

有人打电话给我指出我对regexp不了解的事情。

2 个答案:

答案 0 :(得分:3)

"(?P<type>.+)"将匹配"party/my_brand",因为.匹配任何字符(包括斜杠)。

要防止它与斜杠匹配,您可以使用:

pt2 = '^/show/(?P<season>[^/]+)/(?P<year>[0-9]+)/(?P<type>[^/]+)/$'

其中[^/]表示“任何不是斜线的字符”。

答案 1 :(得分:2)

我认为您应该使用[^ /] +而不是。+来捕获文本,否则点也可以捕获斜杠。