Одним из способов ускорить его было бы выполнение каждого выражения только один раз по всему тексту (объединенные строки). Это не приведет к получению результатов в том же порядке, но сделает это в несколько раз быстрее на тысячах строк.
Очевидно, что печать, когда вы go полностью испортит измерение времени, поэтому я поместил результаты в список для сравнения времени выполнения.
from bisect import bisect_left
from itertools import accumulate
start = timer()
text = "\n".join(a) # single string with all lines
lineIndex = [i for i,c in enumerate(text) if c=="\n"] # map positions to line number
result = [] # accumulate results in a list
for j,expr in enumerate(regs): # execute each expression only once
previ = -1 # finditer may find multiple occurrences on same line
for m in re.finditer(expr,text): # go through all occurrences
i = bisect_left(lineIndex,m.start()) # determine line number
if i == previ: continue
previ = i
result.append((i,j)) # build result list
print(timer() - start)
for i,j in result:
print(f"regs_re[{j}] found i a[{i}]: {a[i]}")