Регулярное выражение для с тире допускается между ними, но не в начале или в конце

Обновить:

Этот вопрос был эпическим провалом, но вот рабочее решение. Это основано на ответе Гумбо (Gumbo's был близок к работе, поэтому я выбрал его как принятый ответ):

Решение:

r'(?=[a-zA-Z0-9\-]{4,25}$)^[a-zA-Z0-9]+(\-[a-zA-Z0-9]+)*$' 

Исходный вопрос (правда, после 3 правки)

Я использую Python, и я не пытаюсь извлечь значение , а скорее проверить, чтобы он соответствовал шаблону.

допустимые значения:

 spam123-spam-eggs-eggs1 spam123-eggs123 spam 1234 eggs123 

Недопустимые значения:

 eggs1- -spam123 spam--spam 

Я просто не могу иметь тире в начале или в конце. Здесь возникает вопрос, который работает в обратном направлении, получая строковое значение после факта, но мне просто нужно проверить значение, чтобы я мог его запретить. Кроме того, он может содержать не более 25 символов , но минимум 4 символа . Кроме того, никакие 2 тире не могут касаться друг друга .

Вот что я придумал после некоторых экспериментов с lookbehind и т. Д .:

 # Nothing here 

4 Solutions collect form web for “Регулярное выражение для с тире допускается между ними, но не в начале или в конце”

Попробуйте это регулярное выражение:

 ^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$ 

Это регулярное выражение позволяет только дефисам отделять последовательности одного или нескольких символов [a-zA-Z0-9] .


Изменить Следуйте за своим комментарием: выражение (…)* позволяет повторить ноту или часть фрагмента внутри группы. Это значит

 a(bc)* 

такой же как

 a|abc|abcbc|abcbcbc|abcbcbcbc|… 

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

 (?=[a-zA-Z0-9-]{4,25}$)^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$ 

Текущее регулярное выражение простое и достаточно читаемое. Вместо того, чтобы сделать это длинным и сложным, рассмотрели ли вы применение других ограничений с помощью обычных инструментов обработки строк Python?

 import re def fits_pattern(string): if (4 <= len(string) <= 25 and "--" not in string and not string.startswith("-") and not string.endswith("-")): return re.match(r"[a-zA-Z0-9\-]", string) else: return None 

Это должно быть примерно так:

 ^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$ 

Вы говорите ему искать только один символ, либо az, AZ, 0-9, либо – это то, что делает [].

Поэтому, если вы выполняете [abc] вы будете соответствовать только «a» или «b» или «c». не "abc"

Повеселись.

Если вы просто не хотите тире в конце и начале, попробуйте ^[^-].*?[^-]$

Редактировать: Ба, вы меняете его.

  • python -regex, соответствующий списку слов
  • Как заменить только часть соответствия на python re.sub
  • python .replace () regex
  • Что такое регулярное выражение для удаления точек в аббревиатурах, но не в именах доменов?
  • Получать последовательные заглавные слова с использованием регулярного выражения
  • Regex Python - почему конец строки ($ и \ Z) не работает с групповыми выражениями?
  • Регулярные выражения Python для фильтрации списка строк
  • Регулярное выражение | REGEX для кодов ICD9
  • Python - лучший язык программирования в мире.