1
fanzeyi 2012-02-19 21:30:19 +08:00
def unicode_len(text):
if isinstance(text, str): return len(text.encode('utf-8')) return len(text) 俺是这么写的 |
2
kingwkb OP @fanzeyi
>>> u = '中文' >>> isinstance(u,str) True >>> u = 'aaaa' >>> isinstance(u,str) True >>> u = u'中文'.encode('utf8') >>> isinstance(u,str) True >>> u = u'中文'.encode('gbk') >>> isinstance(u,str) 这都一个样。。。 |
3
iwinux 2012-02-19 21:39:07 +08:00
大致思路是这样的:
pattern = re.compile(r'^([A-Za-z]{3}|{han}{2})$') valid = pattern.match(name) 可惜的是 Python 的正则没法直接匹配汉字(Ruby 里可以 = =),需要做一些额外处理,可以参考 Stack Overflow 上的这个问答:http://stackoverflow.com/questions/2718196/how-to-find-all-chinese-text-in-a-string-using-python |
4
fanzeyi 2012-02-19 21:39:28 +08:00
....显然是要都化成Unicode然后len就是长度了。。。
In [5]: len(u'测试') Out[5]: 2 In [6]: len('测试') Out[6]: 6 |
5
fanzeyi 2012-02-19 21:41:02 +08:00
哦我错了应该是decode...
|
6
fanzeyi 2012-02-19 21:41:39 +08:00
In [13]: unicode_len(u'测试')
Out[13]: 2 In [14]: unicode_len(u'aaa') Out[14]: 3 In [15]: unicode_len('aaa') Out[15]: 3 In [16]: unicode_len('测试') Out[16]: 2 In [17]: unicode_len('测试aa') Out[17]: 4 In [18]: unicode_len(u'测试aa') Out[18]: 4 |
7
zythum 2012-02-19 21:50:48 +08:00
经许浩大人调教
/[a-zA-Z]{3}|[\u4e00-\u9fa5]{2}/ 应该没问题了 |
8
kingwkb OP @fanzeyi 用unicode的话,中文和字母都是1,怎么判断中文至少2个,英文3个
比如 用户名是“中文”,这个可以注册,2个中文 用户名是“中”,这个不可以注册 用户名是“aa”,这个不可以注册,英文至少3个 |
11
kingwkb OP pattern = re.compile(u'([\u4e00-\u9fa5])')
m = pattern.findall(u'中文dfasdf') m [u'\u4e2d', u'\u6587'] >>> pattern = re.compile(u'([a-zA-z0-9])') >>> m = pattern.findall(u'中文dfasdf') >>> m [u'd', u'f', u'a', u's', u'd', u'f'] 好吧,这样解决,分开匹配,m相加 |
12
kingwkb OP 这样还有一点不爽是网页提交的是utf8或者gbk,要先转成unicode,哪位还有更好的办法么?
|
13
iwinux 2012-02-19 22:13:23 +08:00
@kingwkb 这样可以么:
chinese = re.compile('^[\u4e00-\u9fa5]$') english = re.compile('^[A-Za-z]$') chinese_count = 0 english_count = 0 for s in name: if chinese.match(s): chinese_count += 1 elif english.match(s): english_count += 1 valid = (chinese_count >= 2) or (english_count >= 3) or (chinese_count + english_count >= 3) |