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