Вы можете использовать понимание списка для кода, который вы указали в вопросе, это делает код аккуратным.
[re.sub('[0-9]', '#', line) for line in txt.splitlines() if re.findall('[0-9]', line) ]
# Output
['# Introduction', '# Linear Algebra']
Кроме того, как @CertainPerformance упомянул в комментариях, так как вы просто хотите знать,в строке присутствует число, лучше использовать search
вместо findall
.Затем вы можете переписать код понимания списка следующим образом:
[re.sub('[0-9]', '#', line) for line in txt.splitlines() if re.search('[0-9]', line) ]
# Output
['# Introduction', '# Linear Algebra']
Я вижу небольшое улучшение производительности при использовании search
на моей машине.
%%timeit 1000000
[re.sub('[0-9]', '#', line) for line in txt.splitlines() if re.search('[0-9]', line) ]
# 4.76 µs ± 53.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit 1000000
[re.sub('[0-9]', '#', line) for line in txt.splitlines() if re.findall('[0-9]', line) ]
# 5.21 µs ± 114 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)