Допустим, у нас есть Zaptoit:685158:[email protected]
Как вы разделитесь, чтобы оставалось только 685158:[email protected]






Другое решение:
s = 'Zaptoit:685158:[email protected]'
s.split(':', 1)[1]
>>> s = 'Zaptoit:685158:[email protected]'
>>> s.split( ':', 1 )[1]
'685158:[email protected]'
s = re.sub('^.*?:', '', s)
@PEZ: лучше останавливать матч на первом ':' вместо последнего
@orip: я думаю, вы ошибаетесь - вопросительный знак делает его нежадным совпадением, которое, как и предполагалось, остановится на первом двоеточии
Да, я думаю, Ник имеет в виду другое.
В данном случае это не имеет значения, но в целом, если у вас есть выбор между отрицательным символьным классом и неохотным квантификатором (например, '. *?'), Символьный класс имеет тенденцию быть более быстрым, менее ресурсоемким и главное более предсказуемо.
Для меня это ясность. Чем яснее, тем лучше. В этом случае. * ?: совершенно предсказуемо и очень ясно. «Все до первого двоеточия» яснее, чем «Все, кроме двоеточия до первого двоеточия».
Из любопытства я протестировал прирост производительности от использования отрицательного класса символов по сравнению с нежадным символом и подумал, что результаты могут быть интересны и для других: выполнив указанные выше операции 1000000 раз в цикле, 3 раза и усреднив в результате я довольно стабильно получаю сокращение времени выполнения для инвертированного класса символов на 13%.
Извините, забыл скомпилировать регулярные выражения вне цикла for. При этом версия инвертированного класса символов занимает на 34% меньше времени. Я также попытался скомпилировать код с помощью cython, статически объявив int: s и double: s (что должно уменьшить накладные расходы). Затем время сокращается на 40%, поэтому отрицаемый класс персонажа явно быстрее.
Другой метод, без использования split:
s = 'Zaptoit:685158:[email protected]'
s[s.find(':')+1:]
Бывший:
>>> s = 'Zaptoit:685158:[email protected]'
>>> s[s.find(':')+1:]
'685158:[email protected]'
Начиная с Python 2.5 есть еще более прямое решение. Он хорошо деградирует, если разделитель не найден:
>>> s = 'Zaptoit:685158:[email protected]'
>>> s.partition(':')
('Zaptoit', ':', '685158:[email protected]')
>>> s.partition(':')[2]
'685158:[email protected]'
>>> s.partition(';')
('Zaptoit:685158:[email protected]', '', '')
Это именно то, что я искал. Я знал о split(), но раньше не сталкивался с partition(). Спасибо!
Используйте метод str.split () со значением аргумента maxsplit равным 1.
mailID = 'Zaptoit:685158:[email protected]'
mailID.split(':', 1)[1]
Надеюсь, это помогло.
Следующее разделяет строку, игнорирует первый элемент и присоединяется к остальным:
":".join(x.split(":")[1:])
Выход:
'685158:[email protected]'
Обратите внимание, что использование имени переменной «str» не очень хорошая практика, поскольку str () является встроенной функцией.