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

#python #python-3.x #regex

#python #python-3.x #регулярное выражение

Вопрос:

У меня есть требование, при котором мне нужно сопоставить строку, которая удовлетворяет всем приведенным ниже требованиям —

  1. Строка должна иметь длину 12
  2. Строка может содержать только следующие символы — алфавиты, цифры и пробелы
  3. Пробелы, если они есть, должны быть в конце строки. Пробелы между ними не допускаются.

Я пробовал использовать приведенное ниже регулярное выражение —

 "^[0-9a-zA-Zs]{12}$"
 

Приведенное выше регулярное выражение удовлетворяет требованиям # 1 и # 2, но не может удовлетворить # 3.
Пожалуйста, помогите мне выполнить требования.
Заранее спасибо!!

Ответ №1:

Вы можете использовать

 ^(?=.{12}$)[0-9a-zA-Z]*s*$
 

Если должна существовать хотя бы одна буква:

 ^(?=.{12}$)[0-9a-zA-Z] s*$
 

Подробные сведения:

  • ^ — начало строки
  • (?=.{12}$) — строка должна содержать 12 символов
  • [0-9a-zA-Z]* — ноль или более буквенно-цифровых символов
  • s* — ноль или более пробелов
  • $ — конец строки.

Смотрите демонстрацию регулярных выражений.

Комментарии:

1. Это работает на соответствие, как насчет решения, которое позволяет выполнять поиск?

2. @mozway Этот комментарий не имеет отношения к текущим требованиям. Вопрос OP касается проверки, а не извлечения из более длинного текста.

3. Таким образом, мой вопрос, мне любопытно, есть ли у вас ответ на это 😉

4. @mozway Тогда, пожалуйста, продолжайте и опубликуйте его. Я не знаю ваших точных требований.

5. Thanks..it решил мою проблему. Но не могли бы вы объяснить мне (?=.{12} $), как это работает?

Ответ №2:

Используйте границу, не содержащую слов B :

 ^(?:[a-zA-Z0-9]|sB){12}$
 

ДЕМОНСТРАЦИЯ

С его помощью за пробелом не может следовать буква или цифра, а только несловесный символ (пробел здесь) или конец строки.

Чтобы гарантировать, что хотя бы один символ не является пустым:

 ^[a-zA-Z0-9](?:[a-zA-Z0-9]|sB){11}$
 

Обратите внимание, что с PCRE вы должны использовать модификатор D (ТОЛЬКО для КОНЦА ДОЛЛАРА), чтобы убедиться, что $ он соответствует концу строки, а не перед последней последовательностью перевода строки. Или лучше заменить $ на z . С Python и модулем re такой проблемы нет.

Ответ №3:

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

 ^(?!.*hS)[da-zA-Zh]{12}$
 

Демонстрация регулярных выражений

Подробности регулярных выражений:

  • ^ : Начать
  • (?!.*hS) : Отрицательный прогноз на ошибку сопоставления, если за пробелом следует символ, не содержащий пробелов
  • [da-zA-Zh]{12} : Сопоставьте 12 буквенно-цифровых символов или пробелов
  • $ : End