我正在编写一个简单的程序来用*(asterisk)
替换字符串中的重复字符。但这里的事情是我可以在字符串中打印第一次出现的重复字符,但不能打印其他出现的字符。
例如,
如果输入为Google
,则输出应为Go**le
。
我可以用星号替换重复的字符,但是无法找到打印第一次出现的字符的方法。换句话说,我现在的输出是****le
。
请查看我的 Python3
代码:
s = 'Google'
s = s.lower()
for i in s:
if s.count(i)>1:
s = s.replace(i,'*')
print(s)
有人可以建议我应该采取什么措施来获得所需的输出吗?
答案 0 :(得分:2)
这是我的方法:
首先,您需要找到第n个字符。然后,您可以使用以下代码段替换其他匹配项:
s = s[:position] + '*' + s[position+1:]
完整的示例代码:
def find_nth(haystack, needle, n):
start = haystack.find(needle)
while start >= 0 and n > 1:
start = haystack.find(needle, start+len(needle))
n -= 1
return start
s = 'Google'
s_lower = s.lower()
for c in s_lower:
if s_lower.count(c) > 1:
position = find_nth(s_lower, c, 2)
s = s[:position] + '*' + s[position+1:]
print(s)
可运行链接:https://repl.it/Mc4U/4
正则表达式方法:
import re
s = 'Google'
s_lower = s.lower()
for c in s_lower:
if s_lower.count(c) > 1:
position = [m.start() for m in re.finditer(c, s_lower)][1]
s = s[:position] + '*' + s[position+1:]
print(s)
可运行链接:https://repl.it/Mc4U/3
答案 1 :(得分:2)
replace
将替换char的所有出现。您需要按照已经看过的字符进行操作,如果重复这些字符则替换JUST这个字符(在特定索引处)。
字符串不支持索引分配,因此我们可以构建一个代表新字符串的新列表,然后再''.join()
。
使用Set
,您可以关注您已经看过的内容。
看起来像这样:
s = 'Google'
seen = set()
new_string = []
for c in s:
if c.lower() in seen:
new_string.append('*')
else:
new_string.append(c)
seen.add(c.lower())
new_string = ''.join(new_string)
print(new_string)
Go**le
答案 2 :(得分:2)
如何使用列表组合?当从另一个列表构建列表时(这是你在这里做的一种,因为我们将字符串视为列表),列表理解是一个很好的工具:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
inputstring = 'Google'.lower()
outputstring = ''.join(
[char if inputstring.find(char, 0, index) == -1 else '*'
for index, char in enumerate(inputstring)])
print(outputstring)
这会产生go**le
。
希望这有帮助!
(已修改使用' *'作为替换字符而不是'#')