用“_”替换textfile中的元音的函数

时间:2017-05-02 13:27:34

标签: python python-2.7

我正在尝试创建一个用“_”替换文本文件中所有元音的函数 到目前为止,这是我的代码:

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

有人可以解释为什么它不是全部都在一行吗?

7 个答案:

答案 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,"_"))

您的代码中出现了什么问题:

  • 你为每个你知道的voyel重复一行的每一个字符,然后你打印一个被voyel取代的字符,这样你就可以打印len(one_line)替换
  • replace function会返回一个新字符串,替换您已完成,请参阅文档:
  

返回字符串的副本,其中所有出现的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标记用于检查aoeuiAOEUI,而无需重复。