我正在尝试创建一个用“_”替换文本文件中所有元音的函数 到目前为止,这是我的代码:
filename = 'test.txt'
wordfile= open(filename)
one_line = wordfile.readline()
for ch in one_line:
if ch in "aeiouAEIOU":
print one_line.replace(ch,"_")
one_line = wordfile.readline()
wordfile.close()
我的文本文件中有“嘀嗒嘀嗒嘀嗒”的字样 它的输出应该是:
t_ck t_ck _r__nd th_ cl_ck
然而,这是我的输出:
t_ck tock around the clock
tick t_ck ar_und the cl_ck
tick tock _round the clock
tick t_ck ar_und the cl_ck
tick tock aro_nd the clock
tick tock around th_ clock
tick t_ck ar_und the cl_ck
有人可以解释为什么它不是全部都在一行吗?
答案 0 :(得分:0)
将打印线放在for循环之外。
for ch in one_line:
# YOUR CODE
print one_line
更新
完整代码:
for ch in one_line:
if ch in "aeiouAEIOU":
one_line = one_line.replace(ch,"_")
print one_line
答案 1 :(得分:0)
您没有保存在循环事件发生时对one_line
所做的更新。
您必须在每个循环事件中保存变量以获得最终结果。
filename = 'test.txt'
wordfile= open(filename)
one_line = wordfile.readline()
output = one_line
for ch in one_line:
if ch in "aeiouAEIOU":
output = output.replace(ch,"_")
print(output)
答案 2 :(得分:0)
语法:
str.replace(old, new[, max])
方法replace()
返回字符串的copy
,其中旧的匹配项已替换为new,可选择将替换次数限制为max。
所以当你这样做时:
for ch in one_line:
if ch in "aeiouAEIOU":
print one_line.replace(ch,"_")
您没有替换one_line
获取更新one_line
所需的预期结果,如下所示:
for ch in one_line:
if ch in "aeiouAEIOU":
one_line = one_line.replace(ch,"_")
print(one_line)
然而,“Zohaib Ijaz”提出的解决方案更好:
data = re.sub("[aAeEiIoOuU]+", "_" ,data)
答案 3 :(得分:0)
您正在迭代输入中的每个字符,如果存在字符匹配则打印整行。所以这发生了好几次。此外,在该打印中,您只替换一个字符的出现次数。请注意,应用replace
不会更改字符串。只有返回值才能完成替换。
您可以使用少一个循环来完成,但是将for ch in "aeiouAEIOU":
one_line = one_line.replace(ch,"_")
print (one_line)
调用的结果分配回字符串变量:
re.sub
考虑使用import re
print (re.sub('[aeiouAEIOU]', '_', one_line))
在一次操作中执行此操作:
app:checkBoxChangeListener="@{article.complete}"
app:itemComplete="@{article.complete}"
答案 4 :(得分:0)
以下是如何替换元音
data = wordfile.read()
data = re.sub("[aAeEiIoOuU]+", "_" ,data)
现在将更新的文本写回文件
data = 'Hello ) world Reply ( some text ) and some Reply ( more text ) and that is ) it.'
data = re.sub("[aAeEiIoOuU]+", "_" ,data)
输出:' H_ll_)w_rld R_ply(s_m_ t_xt)_nd s_m_ R_ply(m_r_ t_xt)_nd th_t _s)_t。'
答案 5 :(得分:0)
您的代码存在的问题是它只读取文件的一行
尝试使用此代码读取文件中的所有行,每行扫描所有字母并将元音替换为 _
filename = 'test.txt'
with open(filename) as file:
for line in file:
print "".join(map(lambda x: '_' if x in "aeiouAEIOU" else x, line))
答案 6 :(得分:0)
首先让我们重新格式化你的代码以匹配现代python实践:
filename = 'test.txt'
with open(filename, 'r') as wordfile:
one_line = wordfile.readline()
for ch in one_line:
if ch in "aeiouAEIOU":
print(one_line.replace(ch,"_"))
len(one_line)
替换返回字符串的副本,其中所有出现的substring old都替换为new
因此,每当您在voyel上进行迭代时,您仍然会修改原始字符串。
replace
适用于整个字符串,因此您不需要对该行的字符进行迭代,但您可以遍历所有的voyels,并将其替换为字符串中的用替换的新字符串替换字符串:
filename = 'test.txt'
with open(filename, 'r') as wordfile:
one_line = wordfile.readline()
for c in 'aoeui':
one_line = one_line.replace(c,"_")
one_line = one_line.replace(c.upper(),'_')
print(one_line)
但问题在于,您仍需要迭代'aoeui'
并为每个voyel替换两次one_line。
我们可以做得更好。
并且,我相信当您编写上述算法时,您的意图是什么:
new_line=''
for c in one_line:
if c.lower() in 'aoeui':
new_line += c
else:
new_line += '_'
这样效率更高,但过于冗长。是的,我们可以做得更好,我们可以使用map()
:
one_line = ''.join(map(lambda c: '_' if c.lower() in 'aoeui' else c, one_line))
print(one_line)
还可以使用列表理解来编写它:
one_line = ''.join(['_' if c.lower() in 'aoeui' else c for c in one_line])
print(one_line)
在这里,我们只是构建一个新字符串,以便对于c
的每个字符,如果c
是一个voyel(无论字符是什么情况),请将其替换为_
或离开否则就是这样。然后''.join()
方法就是从列表中创建一个字符串。
最后还有一个更好的解决方法,就是使用正则表达式:
import re
re.sub('[aoeui]', '_', one_line, flags=re.IGNORECASE)
print(one_line)
这是怎么回事?它实际构建的是有限状态自动机,它将与上面的地图等效,并在输出字符串中放置'_'
或原始字符。
N.B。:IGNORECASE
标记用于检查aoeui
和AOEUI
,而无需重复。