Регулярное выражение Python: строка не содержит «jpg» и должна иметь «-» и строчные буквы - PullRequest
2 голосов
/ 05 ноября 2010

У меня проблемы с поиском регулярного выражения Python для URL-адресов Django. У меня есть определенные критерии, но я не могу придумать волшебную формулу. В конце я могу определить, какая страница является страницей CMS, и передать функции django псевдоним URL, который она должна загрузить.

Вот несколько примеров допустимых строк:

  • о-нас
  • контакт-нам
  • Термины и-условия
  • Информация / узнать-более-PG2
  • Информация / мой-пример-URL

Критерий:

  • Должно быть все в нижнем регистре
  • Должен содержать тире "-"
  • Может содержать цифры, буквы и косую черту "/"
  • Должно быть длиной не менее 4 символов и не более 30 символов
  • Не может содержать специальные символы
  • Не может содержать слова:
    • .jpg
    • .gif
    • .png
    • .css
    • .js

Примеры, которые не должны совпадать:

  • О нас (имеет заглавные буквы)
  • контакт (без тире)
  • pg (менее 4 символов)
  • img / bg.gif (содержит ".gif")
  • files / my-styles.css (содержит ".css")
  • my-page @ (имеет символ, отличный от букв, цифр, тире или косой черты)

Я знаю, что это даже еще не близко, но это насколько я получил:

(?P<alias>([a-z/-]{4,30}))

Я прошу прощения за большие требования, но просто не могу обернуть голову вокруг этого регулярного выражения.

Спасибо!

Ответы [ 2 ]

9 голосов
/ 05 ноября 2010

Я озадачен, почему некоторые комментаторы считают, что это трудно сделать в регулярном выражении. Это именно то, в чем хороши регулярные выражения.

if re.match(
    r"""^             # match start of the string
    (?=.*-)           # assert that there is a dash
    (?!.*\.(?:jpg|gif|png|css|js))  # assert that these words can't be matched
    [a-z0-9/-]{4,30}  # match 4-30 of the allowed characters
    $                 # match the end of the string""", 
    subject, re.VERBOSE):
    # Successful match at the start of the string
else:
    # Match attempt failed

Однако верно, что, поскольку . не входит в число разрешенных символов, проверка запрещенных расширений файлов не является действительно необходимой.

0 голосов
/ 06 ноября 2010

Вот мой первый пост на SO.Pleeaaase, поправьте мой английский всякий раз, когда это будет необходимо, я прошу вас.

Я думаю, что любой из следующих RE подходит правильно:

'(?=.{4,30}\Z)(?=.*-)[-a-z0-9/]+\Z'

'(?=.{4,30}\Z)[a-z0-9/]\*-[-a-z0-9/]\*\Z'

'(?=.{4,30}\Z)(?:[a-z0-9/]+|)-[-a-z0-9/]*\Z'
...