Python通过正则表达式选取callback的方法
本文实例讲述了Python通过正则表达式选取callback的方法。分享给大家供大家参考。具体如下:
最近在瞎想怎么通过xpath去精确抓取文章的正文,跟parselets类似的想法,只不过更简单。
代码设计上采用正则表达式匹配URL,再选择callbackhandler的方式,主要参考web.py的分发器(Dispatcher)。
当然,这个实现比较老土一些,全部用function的方式回调,没有用类。
#!/bin/envpython
importre,sys
#Defineparserfirst.
defbaidu(username):
#Businesslogic
return"UsingparserBaidu.andtheuser'snameis:%s."%username
defqzone(uin):
#Businesslogic
return"UsingparserQzone,andtheuser'sQQis:%s."%uin
#Fromweb.py
defgroup(seq,size):#{{{
"""
Returnsaniteratoroveraseriesoflistsoflengthsizefromiterable.
>>>list(group([1,2,3,4],2))
[[1,2],[3,4]]
>>>list(group([1,2,3,4,5],2))
[[1,2],[3,4],[5]]
"""
deftake(seq,n):
foriinxrange(n):
yieldseq.next()
ifnothasattr(seq,'next'):
seq=iter(seq)
whileTrue:
x=list(take(seq,size))
ifx:
yieldx
else:
break
#}}}
defparser_init(url,mapping):
forpat,whatingroup(mapping,2):
result=re.compile('^'+pat+'$').match(url)
ifresult:
returnwhat,[xforxinresult.groups()]
returnNone,None
if__name__=='__main__':
mapping=(
'http://(?:hi|space).baidu.com/([^/]+)(?:/.*)?','baidu',
'http://(\d+).qzone.qq.com(?:/.*)?','qzone',
)
(func,args)=parser_init(sys.argv[1],mapping)
iffunc:
callback=func
iffuncinglobals():
callback=globals()[func]
ifcallable(callback):
printcallback(*args)
else:
print'Noparserfound.';
希望本文所述对大家的Python程序设计有所帮助。