这是发给我的
< * @ google.com>写道:
Hi Niklas, 如果你只想映射这个:/ region / city / category / supposing 这只是 这个有效字符:[a-zA-Z0-9_] 你可以做到以下几点: - main.py
application = webapp.WSGIApplication([( '/([ - \ W] +)/([ - \ W] +)/([ - \ W] +)', 处理程序)],调试= TRUE)
并在您的处理程序上: class Handler(webapp.RequestHandler): def get(自我,地区,城市,类别): #在方法上使用这些变量 希望这有帮助!
我的网络应用程序可以处理<region>/<city>/<category>
这样的URI,其中包含可选的城市和类别,例如。
/rio_de_janeiro/grande_rio_de_janeiro/casas? #<region>/<city>/<category>
/gujarat/ahmedabad/vehicles-for_sale #<region>/<city>/<category>
/rio_de_janeiro/grande_rio_de_janeiro/ #<region>/<city>
/delhi #<region>
Etc现在我想启用一个请求处理程序,它可以将可选参数除以分隔符/
。如果我在请求处理程序中使用正则表达式'/(.*)
和变量,则第一个变量变为a/b
,第二个变量变为b
,这几乎是我想要的,但a和b为2个不同的变量代替。我为请求处理程序尝试的正则表达式是
application = webapp.WSGIApplication([('/(.*)',MyPage),
我的请求处理程序的函数头是
class MyPage(RequestHandler):
def get(self, location='frankfurt', category='electronics'):
启用HTTP查询,例如/法兰克福,/法兰克福/,/法兰克福/电子,/马德里/公寓,/纽约等,允许所有可能的组合。你能告诉我一个可以达到我想要的正则表达式吗?我想要像mod_rewrite这样的功能但是对于GAE。
由于
澄清
这只是一个“让目录成为变量”的问题,所以这里要说明一下它应该如何运作的一些例子
'/ frankfurt', - 将'frankfurt'放在变量1中 '/ frankfurt /', - 将'frankfurt'放在变量1中 '/ frankfurt / electronics', - 将'frankfurt'置于变量1中,将'electronics'置于可行的2中 '/ frankfurt / electronics /',与上述相同 '/ eu / frankfurt / electronics',与上述相同,即只有最后2组计数 '/ eu / frankfurt / electronics /',与上述相同 '多伦多/闪电',不以/开头不起作用 'toronto / lightningnings /',如上所述 'lima / cars / old',如上所述 'lima / cars / old /'如上所述
我想要处理的典型案例是/ region / city / category,即如果我将示例应用于巴西,它可能是/ rio_de_janeiro / grande_rio_de_janeiro / casas?对于/ region / city / category或印度,它可能是/ delhi / delhi / for_sale或/ gujarat / ahmedabad / vehicles-for_sale
解决方案
据我所知,答案中的解决方案可以用于我的目的:
/(?:[^/]+)/?([^/]*)/?([^/]*)
答案 0 :(得分:2)
在您提供了更多详细信息后,我现在可以提出另一种正则表达式模式:
import re
reg = re.compile('(?:/[^/]+(?=/[^/]+/[^/]+/?\Z)' # this partial RE matches the
# first of 3 groups, if 3
'|' # OR
')' # nothing is catched
'/([^/]+)' # the group always catching something
'(?:/([^/]+)?)?' # the possible second or third group
'/?\Z' ) # the end
for ss in ('/frankfurt', '/frankfurt/',
'/frankfurt/electronics', '/frankfurt/electronics/',
'/eu/frankfurt/electronics', '/eu/frankfurt/electronics/',
'toronto/lightnings', 'toronto/lightnings/',
'lima/cars/old', 'lima/cars/old/',
'/rio_de_janeiro/grande_rio_de_janeiro/casas/Magdalena'):
mat = reg.match(ss)
print ss,'\n',mat.groups() if mat else '- No matching -','\n'
结果
/frankfurt
('frankfurt', '')
/frankfurt/
('frankfurt', '')
/frankfurt/electronics
('frankfurt', 'electronics')
/eu/frankfurt/electronics/
('frankfurt', 'electronics')
toronto/lightnings
- No matching -
lima/cars/old/
- No matching -
/rio_de_janeiro/grande_rio_de_janeiro/casas/Magdalena
- No matching -
但是,你知道,使用正则表达式并不是解决问题所必需的:
for ss in ('/frankfurt', '/frankfurt/',
'/frankfurt/electronics', '/frankfurt/electronics/',
'/eu/frankfurt/electronics', '/eu/frankfurt/electronics/',
'toronto/lightnings', 'toronto/lightnings/',
'lima/cars/old', 'lima/cars/old/',
'/rio_de_janeiro/grande_rio_de_janeiro/casas/Magdalena'):
if ss[0]=='/':
splitted = ss.rstrip('/').split('/')
if len(splitted)==2:
grps = splitted[::-1]
elif len(splitted) in (3,4):
grps = splitted[-2:]
else:
grps = None
else:
grps = None
print ss,'\n',grps if grps else '- Incorrect string -','\n'
结果与上述相同。
答案 1 :(得分:1)
你可以尝试
/(?:[^/]+)/?([^/]*)/?([^/]*)
将变量1中的'a / b',变量2中的'a'和变量3中的'b'。不确定这是否是你想要的。
答案 2 :(得分:1)
可能适合您的解决方案,但您可能会发现它太硬编码了:
您的应用的路线结构如下:
routes = [
('/foo/([a-zA-Z]+)/?', TestHandler),
('/foo/([a-zA-Z]+)/([a-zA-Z]+)/?', TestHandler),
('/foo/([a-zA-Z]+)/([a-zA-Z]+)/([a-zA-Z]+)/?', TestHandler)
]
在您的处理程序中,您需要检查len(args)
,例如:
class TestHandler(webapp.RequestHandler):
def get(self, *args):
if len(args): # assign defaults, perhaps?
答案 3 :(得分:1)
如果你只想映射这个:(区域)/(城市)/(类别)/假设它只有这个有效字符:[a-zA-Z0-9 _]
您可以执行以下操作: - main.py
application = webapp.WSGIApplication([
('/([-\w]+)/([-\w]+)/([-\w]+)', Handler)
],debug=True)
并在您的处理程序上:
class Handler(webapp.RequestHandler):
def get(self, region, city, category):
# Use those variables on the method
希望这有帮助!