2016-12-13 64 views
0

我想知道是否有办法做得更好?我想找到的每个对象转换成字符串,因为我觉得它与发现整个列表,然后在列表中转化每个项目:在re.findall上运行()

aList = regexObj.findall(s.text) if regexObj.findall(s.text) else None 

self._menuUrls = map(lambda x: str('https://....' + x + '?otherparams=...'), aList) 

是否有预先制作方法,我可以用它来做到这一点在一次通过或将这需要我创建一个单独的方法/ lambda?我能如何更有效地处理这个问题?

编辑:我做了一个包含500k可匹配实例的文件的几个方法的自己的研究,发现re.findall()的列表理解比使用re.finditer()在列表理解中快40-50%当你搜索一个项目的时候。

menuUrls = [] 

start = time.time() 

regex = re.compile("javascript:iframeLink\('([^']+)'\);") 

#My Original Solution = 0.78200006485 
menuUrls = map(lambda x: str('http://...' + x + '?param=...'), regex.findall(str(lines))) 

#My Revised Solution = 0.619000196457 
menuUrls = [ str('http://...' + x + '?param=...') for x in regex.findall(str(lines)) ] 

#Friend's Proposal = 0.802000045776 
for m in regex.finditer(str(lines)): 
    menuUrls.append(str('http://...' + m.group(1) + '?param=...')) 

#Stack Proposal = 0.912000179291 
menuUrls = [ str('http://...' + x.group(0) + '?param=...') for x in regex.finditer(str(lines)) ] 

set(menuUrls) 

print time.time() - start 
+0

嗯,首先,'ALIST = regexObj.findall(s.text)if regexObj.findall(s.text)else None'非常低效,因为你调用了'regexObj.findall(s.text)'两次... –

回答

0
menuUrls = [] 

start = time.time() 

regex = re.compile("javascript:iframeLink\('([^']+)'\);") 

#My Original Solution = 0.78200006485 
menuUrls = map(lambda x: str('http://...' + x + '?param=...'), regex.findall(str(lines))) 

#My Revised Solution = 0.619000196457 
menuUrls = [ str('http://...' + x + '?param=...') for x in regex.findall(str(lines)) ] 

#Friend's Proposal = 0.802000045776 
for m in regex.finditer(str(lines)): 
    menuUrls.append(str('http://...' + m.group(1) + '?param=...')) 

#Stack Proposal = 0.912000179291 
menuUrls = [ str('http://...' + x.group(0) + '?param=...') for x in regex.finditer(str(lines)) ] 

set(menuUrls) 

print time.time() - start 

regex.findall的列表理解()进行测试,以最快的搜索和改造建议的解决方案的功能

0

您正在寻找re.finditer。喜欢的东西:

regex_iter = regexObj.finditer(s.text) 
self._menuUrls = ['https://....' + x.group(0) + '?otherparams=...' for x in regex_iter] 

这是微不足道的,但通常列表理解会比maplambda快(事实上,比map与任何其他非内置函数)。

演示:

>>> import re 
>>> text = "1 234 6 889 33 5 777 dff hd ae 2 ggre 777 fdf" 
>>> pattern = re.compile(r"\d+") 
>>> nums = ['<'+ m.group(0) + '>' for m in pattern.finditer(text)] 
>>> nums 
['<1>', '<234>', '<6>', '<889>', '<33>', '<5>', '<777>', '<2>', '<777>'] 
>>>