Как взять из строки только цифры | Блог python программиста
Изображение гика

Блог питониста

Как взять из строки только цифры

6 октября 2018 г.

Недавно была одна задача, в принципе, элементарная, но, видимо, не нaстолько простая, как показалось мне на первый взгляд.

Представьте, что у вас есть строка вида "+7 (123) 4567890", вам нужно взять из нее только цифры. "Что может быть проще?", - подумал я и, конечно, не сделал так:

1 phone_number = "+7 (123) 4567890"
2 phone_number = phone_number.replace('+', '').replace(' ', '').replace('(', '').replace(')', '')

Кроме того, я решил не использовать регулярки, потому что, как говорится, "Если у тебя есть проблема и ты ее решил регуляркой, то у тебя две проблемы". Я сделал так:

1 phone_number = "+7 (123) 4567890"
2 for char in ('+', ' ', '(', ')'):
3 	phone_number = phone_number.replace(char, '')

Это, конечно, лол, но мне тогда показалось это хорошим решением. Но что, если по какой-то причине вариантов нецифровых символов будет больше, что, переписывать код? Не говоря уже о том, что это можно сделать короче и красивее. Увидев этот код, коллега попросил меня его срочно переписать, и он был прав. Сначала стоит вспомнить, что у строки есть метод isdigit:

1 print(''.join([x for x in '+7 (123) 4567890' if x.isdigit()]))

Ну или, к примеру, так, если вы любите лямбды:

1 print(''.join(filter(lambda x: x.isdigit(), "+7 (123) 4567890")))

Кроме того, мое предубеждение по поводу регулярок оказалось чрезмерным. Если рассудить здраво, то их можно и нужно использовать в подходящих ситуациях, просто делать это надо с умом. Как вам, например такой вариант?

1 import re
2 print(re.sub("\D", "", '+7 (123) 4567890'))

Ну или так:

1 import re
2 print(''.join(re.findall('\d', '+7 (123) 4567890')))

Этот случай меня научил тому, что никогда не нужно переставать сомневаться в себе и в своем коде. Кто-то говорит, что нужно быть уверенным в себе. Но как тогда быть с вероятностью напороть косяков?

Я не буду строить из себя психолога, мои рассуждения об этом могут показаться бредом, и я правда в этом не разбираюсь, но, мне кажется, здесь есть определенное противоречие: с одной стороны нужно быть уверенным в себе, а следовательно и в своей работе, но с другой стороны нужно критически относиться к себе. Вот, что пишет один человек:

У каждого есть внутренний голос, который время от времени говорит: «лол, ты ничтожество». И без этого внутреннего голоса мы бы не лезли по книгам, не пересматривали по три раза написанное или не убивали бы 20-30 часов в месяц на переписывание «с нуля» уже имеющегося кода\текста\макета (берите любую созидательную профессию). Не знаю, может у женщин психика как-то устроена иначе, но мужской коллектив, состоящий из профессионалов — это Колизей насилия и взаимного угнетения знанием, в котором постоянно льется чья-то интеллектуальная кровь. При этом параллельно эти люди протягивают друг другу «бинты» и прочие «медикаменты» в виде информации и советов. А вот вопрос взаимопомощи и социального контакта — совершенно иная плоскость. При наличии наставника, который покажет на ошибки и научит их исправлять, любой с «синдромом самозванца» будет расти и крепнуть как специалист.

Короче, я к тому, что методы оправдывают цели, в большинстве случаев. И конкретно в моем случае, если бы не постоянный гнет моего внутреннего «самозванца» вкупе с парой-тройкой «церберов», которые тыкали мне на мои ошибки, ничему бы я так толком и не научился. Тепло, ласка, поддержка и кружечка какао — расслабляют, дают ложное чувство «ай, и так сойдет». С другой стороны — никто не может критиковать тебя сильнее, чем ты сам. Если твою работу жестче оценивает кто-то из вне (а не ты сам), при этом тебе кажется эта критика необьективной (при минимум одинаковом уровне компетенции), то, товарищ, у тебя проблемы с самооценкой, что фатально.

Поэтому я не вижу серьезной проблемы в «синдроме самозванца» — это очередной адаптивный механизм психики, без которого этот мир бы не существовал.

Метки

python жизнь
Если вам понравился пост, можете поделиться им в соцсетях: