#python #regex
Вопрос:
такие строки хороши
крис тест 1
кристест1
это не
крис ^amp;^amp;^%^(
^%^amp;%^amp;$*(%кристест1
крис тест 1 %^amp;%(^)amp;)(amp;
в основном это должны быть просто буквы, цифры и пробелы.
однако мой код все еще проверяет строки со специальными символами.
def post(self, request, *args, **kwargs):
data = ContentCreatorCreatorDisplayNameUniqueValidCheckSerializer(data=request.data)
if data.is_valid(raise_exception=True):
data = data.validated_data
# check if the name is valid
# only letters numbers and spaces
pattern = re.compile('([a-zA-Z0-9s]) ')
print(data['name'])
if pattern.match(data['name']):
print('it validated the pattern')
важными строками регулярного выражения являются:
pattern = re.compile('([a-zA-Z0-9s]) ')
print(data['name'])
if pattern.match(data['name']):
когда я проверяю regExr.com
код работает против тестового ввода, как показано на рисунке.
Есть ли что-то, чего мне не хватает в python? Мое регулярное выражение все еще отключено?
Комментарии:
1. Почему бы вместо этого не написать регулярное выражение, которое ищет один символ, которого нет в этом классе символов? Вы знаете, что можете инвертировать классы символов , верно? На самом деле вся эта страница-полезный ресурс.
2. Кроме того, нет необходимости каждый раз перекомпилировать регулярное выражение. Если вы выполните повторное сопоставление(‘([a-zA-Z0-9s]) ‘, данные[‘имя’])
,
, повторное сопоставление скомпилирует его в первый раз, но затем кэширует и с этого момента будет использовать кэшированное значение.3. Это помогает написать сценарий, который фокусируется только на вашей проблеме. если проблема в том, что
re.match('([a-zA-Z0-9s]) ', 'chris ^amp;^amp;^%^(')
это не отклоняет эту строку, то это ваш вопрос прямо здесь. Просто удалите все, что не связано.
Ответ №1:
re.match
Метод гарантирует только то, что совпадение начинается с начала заданной строки. Вам все равно придется закрепить конец строки с помощью a $
, чтобы убедиться, что шаблон охватывает всю строку:
pattern = re.compile('[a-zA-Z0-9s]
)