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

#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] 



)