我有理解正则表达式匹配的问题。简而言之,这个小脚本会给出错误的结果。
在:
#!/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不了解的事情。
答案 0 :(得分:3)
"(?P<type>.+)"
将匹配"party/my_brand"
,因为.
匹配任何字符(包括斜杠)。
要防止它与斜杠匹配,您可以使用:
pt2 = '^/show/(?P<season>[^/]+)/(?P<year>[0-9]+)/(?P<type>[^/]+)/$'
其中[^/]
表示“任何不是斜线的字符”。
答案 1 :(得分:2)
我认为您应该使用[^ /] +而不是。+来捕获文本,否则点也可以捕获斜杠。