2015-08-25 4 views
3

Мне нужно написать функцию, которая принимает две строки (текст и слово) и возвращает текст с выбранным словом, замененным звездочками (количество звездочек должно соответствовать числу букв в цензуре.).Python, join() function, добавление пробела между словами

Например:

если текст = "Эй, эй, эй" и слово = "эй" возвращаемый текст должен быть:

'*** *** ***' 

Вот мой код:

def censor(text,word): 
    text = text.split(" ") 
    asterisks=[] 
    text_with_asterisks=[] 

    for item in text: 
     if item not in word: 
      text_with_asterisks.append(item) 
     else: 
      asterisks=[] 
      for letter in word: 
       asterisks.append("*") 

      text_with_asterisks.append(' '.join(asterisks)) 
    return (" ".join(text_with_asterisks)) 

Код работает, но он возвращает:

********* 

и не

*** *** ***. 

После того, как я использую строку:

return ("_".join(text_with_asterisks)) 

вместо этого я получаю:

'***_***_***' 

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

Спасибо!

+0

Я получаю '* * * * * * * * *' –

+2

я не получаю тот же результат, как вы. Я получаю '' * * * * * * * * * '. Это происходит из-за строки 'text_with_asterisks.append ('' .join (asterisks)). Если я изменю '' ''там на' ''', я получаю '*** *** *** ''. – TheBlackCat

+2

Вы можете умножить строки: '' * '* len (word) ' –

ответ

3

У вас есть дополнительное пространство, когда вы присоединитесь к своим звездочкам:

def censor(text, word): 
    text = text.split(" ") 
    asterisks=[] 
    text_with_asterisks=[] 

    for item in text: 
     if item not in word: 
      text_with_asterisks.append(item) 
     else: 
      asterisks=[] 
      for letter in word: 
       asterisks.append("*") 

      text_with_asterisks.append(''.join(asterisks)) #here's the culprit 
    return (" ".join(text_with_asterisks)) 

censor("hey hey hey", "hey") выводит то, что вы хотите ('*** *** ***')

Я просто указал ваша ошибка, но, безусловно, есть более элегантный и эффективный способ делать то, что вы хотите.

+0

Большое спасибо. Сейчас это прекрасно. К сожалению, мне не разрешено использовать метод Regex или аналогичный, но я согласен, что есть более элегантный способ его решения. – WhiteM

3

Вот самое простое решение

text.replace(word, "*" * len(word)) 
+0

Это также заменит слово, если оно является частью другого слова, например. он заменит «задницу» в «массах». Лучше использовать регулярное выражение с метками границы слова. –

+0

text.replace ("" + слово + "", "*" * len (слово)) - помогите? – dmr

+0

Как насчет пунктуации? –

1

В text_with_asterisks.append(' '.join(asterisks)) же, каждом символе присоединяется " ", а затем " ".join(text_with_asterisks) также делает каждое слово, соединенные " ", таким образом, выход: * * * * * * * * *, где есть пространство между каждой звездой.

3

Regex способ сделать это -

import re 
def censor(text,word): 
    return re.sub(r'\b(?i){0}\b'.format(re.escape(word)),'*' * len(word), text) 

Пример/Demo -

>>> censor('hey hey they hey','hey') 
'*** *** they ***' 

>>> censor('hey hey they Hey','hey') 
'*** *** they ***' 
+0

Как насчет '(? I)' для того, чтобы сделать его нечувствительным к регистру и 're.escape (word)'? В противном случае, именно то, что я просто хотел опубликовать. –

+0

Done - 're.sub (r '\ b (? I) {0} \ b'.format (re.escape (word)),' * '* len (word), text)' –

2

У вас есть пробелы между каждым * в слове, а также дополнительные пробелы между словами, так что я думаю, вам нужны только пробелы между словами:

def censor(text, word): 
    return ' '.join('*'*len(word) if word==item else item for item in text.split()) 
2

Простое решение,

>>> text = "hey hey hey" 
>>> "***".join(text.split("hey")) 
'*** *** ***' 

Или

>>> text = "hey hey they Hey','hey" 
>>> " ".join([ '***' if word.lower() == 'hey' else word 
... for word in text.replace("'","").replace(","," ").split()]) 
'*** *** they *** ***' 
0
def censor(text, censor_w): 
    splitted_text = text.split(" ") 
    asterics = "*" * len(censor_w) 
    result = [] 

    for word in splitted_text: 
     if word == censor: 
      result.append(asterics) 
     else: 
      result.append(word) 

    return " ".join(result) 
+0

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – secelite

Смежные вопросы