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))

 

posted @ 2018-08-29 17:36  蜜酥糖糖糖丶  阅读(120)  评论(0编辑  收藏  举报