使用正则表达式¶
小白回顾了一下自己写的代码。“哇!代码已经超过100行了!”小白不由地沾沾自喜,一种成就感油然而生。至此,小白已经完成了通讯录的增加,和读写了。 对于通讯录,还有一个重要的功能,查询通讯录信息还没有实现。
增加通讯录搜索功能¶
下面, 小白决定为他的通讯录增加搜索功能。 比如,当用户查询字符串 Su 时,根据这个名字查找出通讯录中Su的所有记录(以前都是根据ID来找的)。
最初的代码
def search_str(self,key,str_):
#根据字符串来搜索
#取得编号
try:
num=self.content[0].index(key)
relist=[]
for i in self.content:
if self.content.index(i)==0:
continue
if str_ == i[num]:
relist.append(self.content.index(i))
return relist
except:
print "没有这个记录"
def search_string(self,key,str_):
#对search_string的包装
try:
lis=[]
lis_=self.search_str(key,str_)
for i in lis_:
lis.append(self.content[i])
return lis
except:
pass
改进¶
上面的代码虽然可以查询通讯录信息了,但是需要完全匹配才能查询(str_ == i[num]这块代码限定了查询字符串和通讯录的信息必须完全匹配。)。比如,即使通讯录里存在“何小白”的记录,查询“小白”时也不能匹配任何结果。仅仅是名字的“完全”匹配,太死板了。小白希望他的通讯录能够支持模糊匹配。 也就是,查询“小白”时,所有关于“何小白”,“王小白”,“刘小白”等相关记录都可以匹配。又比如,要寻找所有姓王的人的信息,或者寻找在89年出生的人。这些高级查询功能应该怎么实现呢?
于是小白在必应搜索:”模糊匹配 python”搜到了!有http://wiki.ubuntu.org.cn/Python%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97 一文,提到用“正则表达式”。
正则表达式?不懂,搜索一下,找到维基百科上关于正则表达式的介绍:http://zh.wikipedia.org/zh/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
正则表达式¶
在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。Python提供了re模块进行正则表达式的操作。小白在ubuntu的wiki上知道了re.complie是编译正则表达式,创建一个正则对象。re.match是匹配字符串,当不能匹配时,就返回空值!
所以,小白只要使用
if nam:
就可以判断是否匹配了!
最简单的正则表达式¶
.*Su.*
可以匹配
- QidongSu
- SuQidong
- Su
- QiSuDong
.* 就是代表任何长度的字符串,包括空字符串。
修改了几句代码就ok了! 小白根据ubuntu上看到的例子,使用 p = re.compile(str_)创建一个正则表达式模板,然后使用nam=p.match(i[num])找到匹配模板的结果。
小白修改后的代码如下:
def search_str(self,key,str_):
#str_可以是正则表达式
#根据字符串来搜索
#取得编号
try:
p = re.compile(str_)
num=self.content[0].index(key)
relist=[]
for i in self.content:
nam=p.match(i[num])
if self.content.index(i)==0:
continue
print nam
if nam:
relist.append(self.content.index(i))
return relist
except:
print "没有这个key"
小白看了看自己的代码。“恩,不错!小白真牛!”。小白想,“我写了一百多,快200行代码了,应该可以叫“小灰”了吧!”。小白对自己取得的成果洋洋得意。