使用replace而不是find

时间:2016-09-28 17:02:28

标签: python python-3.x

我写过以下文章,但无法确定下一部分:

if request.guess in game.target:            
  position = game.target.find(request.guess)
  game.correct[position] = request.guess.upper()

这里的要点是request.guess是一个字符输入,如'a'game.target'austin'。因此,上面的代码将在目标字中找到字符并生成类似a*****的输出。但是我的代码只适用于那些字母不重复的单词,例如:澳大利亚。我知道python中有一个方法'replace',但我无法弄清楚我应该如何合并。

请帮助!!!!!

4 个答案:

答案 0 :(得分:2)

只需使用一组猜测字母,然后执行以下操作。

In [164]: word = 'Australia'
In [165]: guessed = set()
In [166]: guessed.add('a')
In [167]: print(''.join(c if c.lower() in guessed else '*' for c in word))
A****a**a

答案 1 :(得分:1)

使用正则表达式:

import re
correct = re.sub(r'[^a]',"*","australia")  # returns "a****a**a"

这个正则表达式[^a]匹配除" a"之外的所有字符。 re.sub函数替换每个"而不是"使用" *"

修改

您的评论认为您正在尝试通过替换该字符串中的字符来更改game.correct字符串。请记住,python中的字符串是不可变的。您无法更改其中的单个字母。因此,不要试图将星星改为" a",而是必须创建一个新的字符串。正则表达式是实现此目的的一种方法。

答案 2 :(得分:0)

replace在这里没有帮助,因为您没有更改要搜索的字符串。

这里有两个选项:

  1. 重复使用str.find

    pos = 0
    while True:
        pos = game.target.find(request.guess, start=pos)
        if pos == -1: break
        game.correct[pos] = request.guess.upper()
    
  2. 每次从头开始构建字符串:

    game.correct = ''.join(
        letter if letter in request.guesses else '*'
        for letter in game.target
    )
    

答案 3 :(得分:0)

我建议您花一些时间学习regular expressions,它们在许多类似情况下派上用场,并且通常比临时实施更具表现力(和效率)。此外,您可以重用(有些怪癖)您对其他语言和操作系统shell的理解,这使它们非常强大。

您可以从模式中构建一个正则表达式,该表达式将匹配除您要查找的字符之外的任何内容:r'[^{}]'.format(pattern);然后用它来做替换:

import re
pattern = request.guess
result = re.sub(r'[^{}]'.format(pattern),"*","adam")

Example on IdeOne

import re
print re.sub(r'[^{}]'.format('ad'),"*","adam")
print re.sub(r'[^{}]'.format('a'),"*","adam")
print re.sub(r'[^{}]'.format('m'),"*","adam")

打印:

ada*
a*a*
***m