Я бы сказал, что цель вашего кода ясна, а код короток и прост, поэтому в этом нет ничего плохого.Если вам все еще мешает повторное использование переменной, вы можете сделать что-то вроде этого:
for line in lines:
match = re.search(r'@Table\(name = "(.*)"\)', line)
if match:
output_line = "".join(['@Table (name = "', prefix, match.group(1)[:max_len], '")', '\n'])
else:
output_line = line
f.write(output_line)
f.close()
Таким образом, каждое имя переменной все время точно описывает ее содержимое.