这是寄给我的
@google.com写道:
嗨,尼可拉斯,如果你只想映射这个:/region/city/ can /假设它只有以下有效字符: a-zA-Z0-9_您可以执行以下操作:- main.py
应用程序= webapp.WSGIApplication([('/(-\w+)/(-\w+)/(-\w+)',处理程序)],debug=True)
在您的处理程序上:类处理程序(webapp.RequestHandler):def (self、region、city、分类):#在方法Hope!上使用这些变量
我的webapp是用来处理像<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>等等,现在我想启用一个请求处理程序,它可以采用可选的参数,由分隔符/除以。如果我在请求处理程序中使用regex '/(.*)和变量,那么第一个变量变成a/b,第二个变量变成b,所以这几乎是我想要的,但是a和b作为两个不同的变量代替。请求处理程序尝试的正则表达式是
application = webapp.WSGIApplication([('/(.*)',MyPage),
请求处理程序的函数头是
class MyPage(RequestHandler):
def get(self, location='frankfurt', category='electronics'):若要启用HTTP查询,如/frankfurt、/法兰克福/、/法兰克福/电子、/马德里/公寓、/newyork等,则允许所有可能的组合。你能告诉我一个能实现我想要的目标的准则吗?我想要像mod_rewrite那样的功能,但是对于GAE。
谢谢
澄清
这只是一个“使目录成为变量”的问题,因此,为了澄清这里的一些示例,它应该如何运行
“/法兰克福”如上“利马/汽车/旧/”
我想要处理的典型案例是/区域/城市/类别,也就是说,如果我将这个例子应用于巴西,它可能是/rio_de_里约热内卢/grande_rio_de_de/casas?对于/区域/城市/类别或印度,可以是/德里/德里/待售或/古吉拉特/艾哈迈达巴德/车辆待售。
溶液
就我所能分辨出的解决方案和答案而言,我的目的是:
/(?:[^/]+)/?([^/]*)/?([^/]*)
发布于 2011-09-24 17:53:28
在您提供了更多细节之后,我现在可以提出另一个regex模式:
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'结果与上述相同。
发布于 2011-09-24 18:33:17
一个可能对你有用的解决方案,尽管你可能会发现它太硬编码了:
您的应用程序的路由结构如下:
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?发布于 2011-09-27 21:36:11
如果您只想映射如下:(区域)/(城市)/(类别)/假设它只有以下有效字符: 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希望这能有所帮助!
https://stackoverflow.com/questions/7538803
复制相似问题