Есть ли способ заменить и удалить строки многострочной строки - PullRequest
5 голосов
/ 01 апреля 2019

Я пытаюсь обработать многострочную строку, заменить и удалить некоторые строки. вот код.

>>> txt
'1 Introduction\nPart I: Applied Math and Machine Learning Basics\n2 Linear Algebra'
>>> tmp = []
>>> for line in txt.splitlines():
...     if re.findall('[0-9]', line):
...         replaced = re.sub('[0-9]', '#', line)
...         tmp.append(replaced)
>>> print(tmp)
['# Introduction', '# Linear Algebra']

этот кусок кода сделал мою работу, хотя я не уверен, что это самый эффективный способ.

я пробовал это post и doc , похоже, что ни одна из их многочисленных находок не предназначена для многострочных.

Есть ли более эффективный способ сделать это?

1 Ответ

1 голос
/ 01 апреля 2019

Вы можете использовать понимание списка для кода, который вы указали в вопросе, это делает код аккуратным.

[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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...