Python сопоставляет строку unicode как unicode

#python #regex

#питон #регулярное выражение

Вопрос:

Я пытаюсь сопоставить строку Юникода таким образом, чтобы юникод не соответствовал строковому литералу.

 def validate(username):
    if "admin" in username:
        return False
    else:
        return True

validate(username)
 

Если я пройду username="u0061u0064u006du0069u006e" , он вернет False, так как он преобразует юникод, а затем сопоставляет и "u0061u0064u006du0069u006e" является юникодом для администратора. Есть ли способ сопоставления перед преобразованием? Входные данные не преобразуются, они начинаются как unicode. Я пробовал использовать регулярные выражения, но безуспешно.

Ответ №1:

В Python 3 больше нет различия между «юникодом» и «строкой». Таким образом, строка "u0061u0064u006du0069u006e" — это просто строка символов a , d , m , i , n , но с использованием escape-последовательностей кодовых точек unicode; здесь не происходит никакого «преобразования», это в точности эквивалентно вводу "admin" .

Чего вы пытаетесь достичь?

Помните, что escape-последовательности строк, например u0061 , преобразуются во время синтаксического анализа Python, на самом деле они никогда не оказываются частью строки. Если вместо этого пользователь, например, вводит буквенную строку символов u0061u0064u006du0069u006e в текстовую форму, то в нотации Python вы получите строку, эквивалентную "\u0061\u0064\u006d\u0069\u006e" (обратите внимание на экранированные обратные косые черты, чтобы указать, что это буквальные обратные косые черты, а не escape-последовательности).

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

1. В моем примере я надеюсь, что он возвращает True. Я пытаюсь сделать так, чтобы это не совпадало.

2. Невозможно сделать так, чтобы оно не совпадало, поскольку литералы "u0061u0064u006du0069u006e" и "admin" являются точно такой же строкой (или, скорее, они представляют собой разные представления одной и той же строки). Не могли бы вы дать более широкий контекст для того, для чего вы хотите это использовать? Например, это для проверки пользовательского ввода в веб-форме? Чего именно вы хотите избежать в этом более широком контексте?

3. да, они вводятся из веб-формы. Я пытаюсь занести в черный список вводимые пользователем данные и пытаюсь сделать единственный способ, введя ввод. Когда я передаю его SQL, он работает нормально, но если они вводят «admin», я не хочу, чтобы это работало. Проблема в том, что python преобразует юникод при сравнении, а я этого не хочу.

4. Здесь мы приближаемся к корню проблемы. Итак, чтобы было ясно, вы хотите избежать того, чтобы пользователи вводили данные буквально u0061u0064u006du0069u006e ? Или вводить admin в любой форме? Не могли бы вы, возможно, добавить пример упомянутого вами SQL и скриншоты формы с примерами того, что вы делаете, и не хотите работать? По-прежнему сложно помочь вам без дополнительной информации, поскольку я действительно не понимаю, что происходит только из этого.

5. Я бы хотел, чтобы, если u0061u0064u006du0069u006e он будет введен, то он будет переведен на admin .