2014-11-10 2 views
0

Я пытаюсь выяснить, как искать строку в python и возвращать ее, когда все вхождения ее первого символа изменяются на '*' , например - «лепет» дает «ba ** le». Любые предложения о том, как подойти к этому?Возьмите строку и верните все вхождения ее первого символа с '*'

+0

Я не понимаю, почему голосование закрывается, вопрос четко определен, а не «слишком широк». Это не показывает усилий, но это совсем другое дело. – smci

ответ

2

Решение проще, чем выяснить, почему вы хотели бы:

def asteriskify(string): 
    if len(string) == 0: return '' # corner case pointed out by smci 
    return string[ 0 ] + string[ 1: ].replace(string[ 0 ], '*') 
+0

a) Ницца, за исключением случая с коротким корпусом, когда len (s) == 0 или 1. b) Никогда не вызывайте свой аргумент 'string', который маскирует пакет с тем же именем. – smci

+0

@smci good catch on length 0. Длина 1 не проблема. И жизнь слишком коротка, чтобы беспокоиться о столкновениях с именами: они всегда будут иметь место, если не в текущей версии Python, а затем в следующем, когда будут добавлены новые пакеты. – jez

+0

length 1 все еще ошибка, потому что 's [1:]' взрывается с IndexError [EDIT: на самом деле все в порядке, это просто ''] – smci

0

Любые предложения о том, как подойти к этому?

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

https://docs.python.org/release/2.5.2/lib/string-methods.html

+0

Спасибо. Я ценю помощь. –

2

Слегка щипая изящное решение @ JEZ, чтобы не взорвать на краеугольных случаях с LEN (ы) == 0 или 1:

def asteriskify(s): 
    if not s: # was if len(s) < 2: 
     return s 
    else: 
     return s[0] + s[1:].replace(s[0], '*') 
0

использованием re.sub

>>> import re 
>>> def asteriskify(my_string): 
...  if len(my_string)>1: 
...   return my_string[0]+re.sub(my_string[0],"*",my_string[1:]) 
...  else: return my_string 
... 
>>> asteriskify("bable") 
'ba*le' 
>>> asteriskify("babble") 
'ba**le' 
>>> asteriskify("b") 
'b' 

с использованием map, lambda:

>>> def asteriskify(my_string): 
...  if len(my_string) > 1: 
...   return my_string[0]+"".join(map(lambda x:"*" if my_string[0]==x else x,my_string[1:])) 
...  else: return my_string 
... 
>>> asteriskify('babble') 
'ba**le' 
>>> asteriskify('b') 
'b' 
>>> asteriskify('baaabbb ahdbb ccc') 
'baaa*** ahd** ccc' 
Смежные вопросы