查找/ <region> / <city> / <category>的正则表达式?</category> </city> </region>

时间:2011-09-24 11:46:37

标签: python regex google-app-engine yaml

这是发给我的

  

&LT; * @ google.com&GT;写道:

     
    

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 / ahmedab​​ad / vehicles-for_sale

解决方案

据我所知,答案中的解决方案可以用于我的目的:

/(?:[^/]+)/?([^/]*)/?([^/]*)

4 个答案:

答案 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

希望这有帮助!