在我的聊天应用TalkTalkTalk中,对于用户名,我只允许使用字母数字字符(A-Z,a-z,0-9):
username = re.sub(r'\W+', '', username) # regex to keep alphanumeric only
这有点过于严格,因为UTF8字符在很多情况下都很有用(名字使用另一个字母而不是latin
等)。现在我想允许其他字母表中的这些有用的UTF8字符,甚至是❤☀☆☂☻♞☯☭things。 (为什么不呢?)
但我不想要:
所有类型的空格,各种换行符(
)
看起来像空的零宽度字符的恶意字符:http://unicode-table.com/fr/200D/
等。更常见的是,每个字符都可以使userA<malicious_char>
看起来像真userA
。
哪些是可打印的UTF8字符?(用于用户名)
如何使用正则表达式过滤它们,例如在Python中?
注意:这个问题是关于找到一个正则表达式来过滤它们,所以它不是一些链接问题的重复。
答案 0 :(得分:2)
您可以在正则表达式中使用标记re.UNICODE
和unicode,\ u200b在技术上不是定义为空格
python 2.7和3
import re
username = u'My \u200bNick \u2602 \u263b \u200c '
white_chars = ['\s', u'\u200b',u'\u200c'] #etc
regex_str = '[' + ''.join(white_chars) + ']'
regex = re.compile(regex_str, flags=re.UNICODE)
regex.sub("", username )
print ( regex.sub("", username ) )
你得到了
u'MyNick\u2602\u263b'
MyNick☂☻