Находите регулярное выражение для / <region>/ <city>/ <category>? - PullRequest
0 голосов
/ 24 сентября 2011

Это было опубликовано для меня

<<em>*@google.com> писал:

Привет Никлас, Если вы просто хотите отобразить это: / регион / город / категория / предположим это только это действительные символы: [a-zA-Z0-9_] Вы можете сделать следующее: - main.py

приложение = webapp.WSGIApplication ([( '/ ([- \ ш] +) / ([- \ ш] +) / ([- \ ш] +)', обработчик)], отлаживать = True)

и в вашем обработчике: Обработчик класса (webapp.RequestHandler): def get (самоуправление, регион, город, категория): # Используйте эти переменные в методе Надеюсь, это поможет!

Предполагается, что мое веб-приложение обрабатывает URI, например <region>/<city>/<category>, с указанием необязательного города и категории, например

.
/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>

И т. Д. Теперь я хочу включить обработчик запросов, который может принимать необязательные аргументы, разделенные на разделитель /. Если я использую регулярное выражение '/(.*) и переменные в обработчике запросов, первая переменная становится a/b, а вторая переменная становится b, так что это почти то, что я хочу, но a и b вместо двух разных переменных. Регулярное выражение, которое я пробовал для обработчика запросов:

application = webapp.WSGIApplication([('/(.*)',MyPage),

И функциональная глава моего обработчика запросов

class MyPage(RequestHandler):
    def get(self, location='frankfurt', category='electronics'):

Чтобы включить HTTP-запрос, например, / франкфурт, / франкфурт /, / франкфурт / электроника, / мадрид / апартаменты, / нью-йорк и т. д., допускающие все возможные комбинации. Можете ли вы посоветовать мне регулярное выражение, которое может достичь того, чего я хочу? Я хочу функциональность, как mod_rewrite, но для GAE.

Спасибо

Разъяснение

Это просто вопрос «сделать каталог переменной», поэтому для пояснения приведу несколько примеров, как он должен вести себя

'/ Франкфурт', - введите переменную "Франкфурт" в 1 '/ Франкфурт /', - поставить переменную "Франкфурт" в 1 '/ frankfurt / electronics', - поставить 'frankfurt' в переменной 1, а 'electronics' в переменной 2 '/ Франкфурт / электроника /', такой же как выше '/ eu / frankfurt / electronics', то же, что и выше, т.е. учитываются только последние 2 группы '/ ЕС / Франкфурт / электроника /', так же, как и выше «Торонто / молнии», не начинается с / так не будет работать «Торонто / молнии /», как указано выше «Лима / Автомобили / Старый», как указано выше 'lima / cars / old /' как указано выше

Типичными случаями, которые я хочу обработать, является / region / city / category, т.е. если я применил пример к Бразилии, это может быть / rio_de_janeiro / grande_rio_de_janeiro / casas? для / регион / город / категория или для Индии это может быть / delhi / delhi / for_sale или / gujarat / ahmedabad / Vehicles-for_sale

Решение

Насколько я могу судить, решение из ответа работает для моих целей:

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

Ответы [ 4 ]

2 голосов
/ 24 сентября 2011

После того, как вы предоставили более подробную информацию, я теперь могу предложить другой шаблон регулярных выражений:

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'

result

/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 голос
/ 28 сентября 2011

Если вы просто хотите отобразить это: (регион) / (город) / (категория) / предполагая, что это только действительные символы: [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

Надеюсь, это поможет!

1 голос
/ 24 сентября 2011

Решение, которое может работать для вас, хотя вам может показаться, что оно слишком жестко задано:

Маршруты для вашего приложения структурированы следующим образом:

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?
1 голос
/ 24 сентября 2011

Вы можете попробовать

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

, который поместит «a / b» в переменную 1, «a» в переменную 2 и «b» в переменную 3. Не уверен, что это именно то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...