2013-05-08 4 views
1

Я пытался соответствовать ниже URL в течение нескольких часов и не могу понять его и Im вполне уверен, что его не так уж сложно:Python соответствия URL (Regex)

URL-адрес может быть это:

/course/lesson-one/ 

или она также может быть:

/course/lesson-one/chapter-one/ 

Что у меня есть, после которого соответствует второму URL:

/course/([a-zA-Z]+[-a-zA-Z]*)/([a-zA-Z]+[-a-zA-Z]*)/ 

То, что я хочу, это вторая часть будет необязательной, но я не могу понять его ближайший я получил следующее:

/course/([a-zA-Z]+[-a-zA-Z]*)/*([a-zA-Z]+[-a-zA-Z]*)/ 

Но выше почему-то оставляет последнюю букву слово, например, если URL является

/course/computers/ 

я в конечном итоге со строкой «компьютер»

ответ

1

используется ? если вам нужны дополнительные детали.

/course/([a-zA-Z][-a-zA-Z]*)/([a-zA-Z][-a-zA-Z]*/)? 
#            ^

(Обратите внимание, что [a-zA-Z]+[-a-zA-Z]* эквивалентно [a-zA-Z][-a-zA-Z]*.)

Используйте дополнительную группировку (?:…) исключить / из матча, позволяя при этом несколько элементов, чтобы быть по желанию сразу:

/course/([a-zA-Z][-a-zA-Z]*)/(?:([a-zA-Z][-a-zA-Z]*)/)? 
#       ~~~      ~^ 

Ваше второе регулярное выражение проглатывает последний символ, потому что:

/course/([a-zA-Z]+[-a-zA-Z]*)/*([a-zA-Z]+[-a-zA-Z]*)/ 
      ^^^^^^^^^^^^^^^^^^^^^ ~~~~~~~~~~~~~~~~~~~~~ 
     this matches 'computer' and this matches the 's'. 

Вторая группа в этом регулярном выражении требуется, чтобы соответствовать несколько алфавитов с длиной 1 или более из-за +, так что «S» должен принадлежать там.

+0

Ok спасибо, это знак вопроса, что Im отсутствует. Просто взглянул на документы, и один лайнер объяснил, почему я его не замечал! – Tkingovr

+0

Второе регулярное выражение, которое вы указали выше, именно то, что мне нужно, также благодарит вас за то, что он объяснил это хорошо +100.Спасибо всем, кто внес свой вклад ниже. – Tkingovr

1

использовать "?" после чего-то считать его необязательным.

>>> r = r"/course/([a-zA-Z]+[-a-zA-Z]*)(/[A-Z[a-z]+[-a-zA-Z]*)?" 
>>> s = "/course/lesson-one/chapter-one/" 
>>> re.match(r, s).groups() 
('lesson-one', '/chapter-one') 
>>> s = "/course/computers/" 
>>> re.match(r, s).groups() 
('computers', None) 
1

Вы можете использовать следующее регулярное выражение:

'/course/([a-zA-Z]+[-a-zA-Z]*)(/([a-zA-Z]+[-a-zA-Z]*)/)?' 

Это делает вторую часть по желанию и по-прежнему соответствует каждой из частей URL.

Обратите внимание, что вторая часть URL имеет две группы: одна, которая соответствует /chapter-one/ и тот, который соответствует chapter-one

>>> re.match('/course/([a-zA-Z]+[-a-zA-Z]*)(/([a-zA-Z]+[-a-zA-Z]*)/)?', '/course/lesson-one/chapter-one/').groups() 
('lesson-one', '/chapter-one/', 'chapter-one') 

Аналогично:

>>> re.match('/course/([a-zA-Z]+[-a-zA-Z]*)(/([a-zA-Z]+[-a-zA-Z]*)/)?', '/course/lesson-one/').groups() 
('lesson-one', None, None) 
Смежные вопросы