首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找到/<region>/<city>/<city>的正则表达式?

找到/<region>/<city>/<city>的正则表达式?
EN

Stack Overflow用户
提问于 2011-09-24 11:46:36
回答 3查看 207关注 0票数 0

这是寄给我的

@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。

代码语言:javascript
复制
/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),

请求处理程序的函数头是

代码语言:javascript
复制
class MyPage(RequestHandler):
    def get(self, location='frankfurt', category='electronics'):

若要启用HTTP查询,如/frankfurt、/法兰克福/、/法兰克福/电子、/马德里/公寓、/newyork等,则允许所有可能的组合。你能告诉我一个能实现我想要的目标的准则吗?我想要像mod_rewrite那样的功能,但是对于GAE。

谢谢

澄清

这只是一个“使目录成为变量”的问题,因此,为了澄清这里的一些示例,它应该如何运行

“/法兰克福”如上“利马/汽车/旧/”

我想要处理的典型案例是/区域/城市/类别,也就是说,如果我将这个例子应用于巴西,它可能是/rio_de_里约热内卢/grande_rio_de_de/casas?对于/区域/城市/类别或印度,可以是/德里/德里/待售或/古吉拉特/艾哈迈达巴德/车辆待售。

溶液

就我所能分辨出的解决方案和答案而言,我的目的是:

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

EN

回答 3

Stack Overflow用户

发布于 2011-09-24 17:53:28

在您提供了更多细节之后,我现在可以提出另一个regex模式:

代码语言:javascript
复制
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'

结果

代码语言:javascript
复制
/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 -

但是,您知道,使用正则表达式对于解决您的问题并不是绝对必要的:

代码语言:javascript
复制
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'

结果与上述相同。

票数 2
EN

Stack Overflow用户

发布于 2011-09-24 18:33:17

一个可能对你有用的解决方案,尽管你可能会发现它太硬编码了:

您的应用程序的路由结构如下:

代码语言:javascript
复制
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),如下所示:

代码语言:javascript
复制
class TestHandler(webapp.RequestHandler):
    def get(self, *args):
        if len(args): # assign defaults, perhaps?
票数 1
EN

Stack Overflow用户

发布于 2011-09-27 21:36:11

如果您只想映射如下:(区域)/(城市)/(类别)/假设它只有以下有效字符: a-zA-Z0-9_

您可以执行以下操作:- main.py

代码语言:javascript
复制
application = webapp.WSGIApplication([
                    ('/([-\w]+)/([-\w]+)/([-\w]+)', Handler)
],debug=True)

在你的经理人身上:

代码语言:javascript
复制
class Handler(webapp.RequestHandler):
    def get(self, region, city, category):
        # Use those variables on the method

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7538803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档