2013-04-03 37 views
0

所以這應該很容易,但我有點想念SO或Python文檔的答案。 我使用這個代碼:在Python中找到N個正則表達式的前N個事件

myregex.findall(source) 

這就產生myregex的所有比賽的名單。 現在,問題是源很長,我只需要首先發生6次匹配myregex的子字符串。我想如果匹配過程在查找到第n個事件後可能會停止,速度會更快。 我該怎麼做:

myregex.findall(source, n) 

回答

6

使用re.finditer

import itertools 
for m in itertools.islice(re.finditer(pat, text), 6): 
    ... 

re.finditer是產生需求match對象發電機。您可以從m.group(0)獲得完整匹配,或從m.group(1)及以上獲得單個匹配模式。

1

既然你想要的性能,使用regex.finditer

def my_find(regex, s, n): 
    const = regex.finditer(s) 
    return [const.next().groups() for i in range(n)] 

或者一個更安全的版本:

def my_find(regex, s, n): 
    const = regex.finditer(s) 
    ret_val = [] 
    for i in range(n): 
     try: 
      ret_val.append(const.next().groups()) 
     except StopIteration: 
      return ret_val 
    return ret_val 
+3

不,這仍然會做所有的搜索。該OP尋找一種方法來減少尋找比賽所花費的時間。 –

+0

我的問題是關於性能。要在列表上執行切片,首先需要計算整個列表,這是我想避免的。 –

+1

然後使用'finditer'。 – pradyunsg

相關問題