从学习python至今,发现很多时候是将python作为一种工具。特别在文本处理方面,使用起来更是游刃有余。
说到文本处理,那么正则表达式必然是一个绝好的工具,它能将一些繁杂的字符搜索或者替换以非常简洁的方式完成。
我们在处理文本的时候,或是查询抓取,或是替换.
一.查找如果你想自己实现这样的功能模块,输入某一个ip地址,得到这个ip地址所在地区的详细信息.
然后你发现http://ip138.com 可以查出很详细的数据
但是人家没有提供api供外部调用,但是我们可以通过代码模拟查询然后对结果进行抓取.
通过查看这个相应页面的源码,我们可以发现,结果是放在三个中的
代码如下:
ip138.com ip查询(搜索ip地址的地理位置) 您查询的ip:121.0.29.231 本站主数据:浙江省杭州市 阿里巴巴参考数据一:浙江省杭州市 阿里巴巴参考数据二:浙江省杭州市 阿里巴巴 如果您发现查询结果不详细或不正确,请使用ip数据库自助添加功能进行修正 ip地址或者域名:
如果你了解正则表达式你可能会写出
正则表达式
代码如下:
(?1949年)
中文处理涉及到编码问题。例如下边的程序识别年份(****年)时
代码如下:
# -*- coding: cp936 -*-import rem0 = “在一九四九年新中国成立”m1 = “比一九九零年低百分之五点二”m2 = ‘人一九九六年击败俄军,取得实质独立’
def fuc(m): a = re.findall(“[零|一|二|三|四|五|六|七|八|九]+年”, m) if a: for key in a: print key else: print “null”
fuc(m0)fuc(m1)fuc(m2)
运行结果
可以看出第二个、第三个都出现了错误。
改进——准化成unicode识别
代码如下:
# -*- coding: cp936 -*-import rem0 = “在一九四九年新中国成立”m1 = “比一九九零年低百分之五点二”m2 = ‘人一九九六年击败俄军,取得实质独立’
def fuc(m): m = m.decode(‘cp936’) a = re.findall(u”[\u96f6|\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d]+\u5e74″, m)
if a: for key in a: print key else: print “null”
fuc(m0)fuc(m1)fuc(m2)
结果
识别出来可以通过替换方式,把汉字替换成数字。
参考
代码如下:
numhash = {}numhash[‘零’.decode(‘utf-8’)] = ‘0’numhash[‘一’.decode(‘utf-8’)] = ‘1’numhash[‘二’.decode(‘utf-8’)] = ‘2’numhash[‘三’.decode(‘utf-8’)] = ‘3’numhash[‘四’.decode(‘utf-8’)] = ‘4’numhash[‘五’.decode(‘utf-8’)] = ‘5’numhash[‘六’.decode(‘utf-8’)] = ‘6’numhash[‘七’.decode(‘utf-8’)] = ‘7’numhash[‘八’.decode(‘utf-8’)] = ‘8’numhash[‘九’.decode(‘utf-8’)] = ‘9’
def change2num(words): print “words:”,words newword = ” for key in words: print key if key in numhash: newword += numhash[key] else: newword += key return newword
def chi2num(line): a = re.findall(u”[\u96f6|\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d]+\u5e74″, line) if a: print “——” print line for words in a: newwords = change2num(words) print words print newwords line = line.replace(words, newwords) return line