python中掉过又爬出来的那些坑
一、中文是不是“字母”?
当然,看到标题你肯定想这答案是显而易见的,但是、but、问题就在这里,我也是这么想的!!!然后就被python打脸了
看下面的例子:
s = '你说我是字母吗' print(s.isalpha())
你以为他是False?不,答案是:
这个问题真是困扰了我一晚上,自己一开始使用正则去匹配的,匹配了半天发现我正则虽然只是略知皮毛,但是,这么简单的东西不会错啊,“\w”怎么就能匹配中文呢?如下:
import re pattern = re.compile('^\w+$') print(pattern.match(s))
看看结果:
他还从头到尾都是匹配的,我真的是试了一晚上,感觉被整个世界欺骗了。
终于,我认清了不是我自己的问题,放弃了继续在正则上下功夫,放弃了与编译软件作对,百度了一下。。。
isalpha函数是针对python2.7默认字符编码下的字符串设计的,所以不适用于unicode编码,在unicode编码下会出错。(言外之意python2是可以直接判断的)
对于unicode str,str.isalpha()会根据字符串中的字符是否属于Unicode编码的LETTER区域来判断是否都由字母组成。所以得出的结果为True,不一定只有26个字母哦。
而正则判断出错是因为在python3 中re默认支持的是unicode字符集,当然也支持汉字。
所以说,如果想用isalpha()来判断字符串是否都是字母,要对str做编码转换,即:
s = '你说我是字母吗' print(s.encode('utf-8').isalpha())
当然,我们更需要用正则来判断,用正则可以用两种方法:
1、加入re.A就可以解决这样问题
import re pattern = re.compile('^\w+$', re.A) print(pattern.match(s))
2、用[a-zA-Z]代替\w
import re pattern = re.compile(r'^[a-zA-Z]+$', re.A) print(pattern.match(s))