Python将文本文件中的字符串替换为列表中的值
我的问题是用另一个字符串替换文本文件中的字符串。这些关键字字符串位于一个名为word_list的列表中。我尝试了以下方法,但似乎没有任何效果。它按原样打印document.text中的句子,无需替换:Python将文本文件中的字符串替换为列表中的值,python,string,replace,Python,String,Replace,我的问题是用另一个字符串替换文本文件中的字符串。这些关键字字符串位于一个名为word_list的列表中。我尝试了以下方法,但似乎没有任何效果。它按原样打印document.text中的句子,无需替换: word_list = {'hi' : 'test', 'how' : 'teddy'} with open("document.txt") as main: words = main.read().split() replaced = [] for y in
word_list = {'hi' : 'test', 'how' : 'teddy'}
with open("document.txt") as main:
words = main.read().split()
replaced = []
for y in words:
replacement = word_list.get(y, y)
replaced.append(replacement)
text = ' '.join(word_list.get(y, y) for y in words)
print text
new_main = open("done.txt", 'w')
new_main.write(text)
new_main.close()
document.txt的内容:
hi you, how is he?
当前输出与document.txt相同,但应为:
test you, teddy is he?
任何解决方案/帮助都将不胜感激:)
这将读取文件的全部内容(如果是大文件,则不是最有效的),然后迭代搜索并替换字典中的项目,并对输入文本调用replace。完成后,它会将数据写入新文件
使用这种方法需要记住的一些事情
- 如果您的输入文件很大,则速度会很慢
- 您的搜索模式还可以匹配单词片段,即
将观看hi
,因此您也应该满足这一要求哪个
import re
word_list = {'hi' : 'test', 'how' : 'teddy'}
with open('document.txt') as main, open('done.txt', 'w') as done:
text = main.read()
done.write(re.sub(r'\b\w+\b', lambda x: word_list.get(x.group(), x.group()), text))
当您可以使用
replace
方法word\u list
是一本字典,尽管它的名称不同,但您为什么要经历所有这些呢。。。另外,当您在最后创建文本时,您完全忽略了替换的
,而宁愿使用生成器表达式。您的代码对我有效吗?“它在document.text中打印出句子”->您检查过done.txt文件了吗?您的代码工作正常。你的问题是什么?我知道,这就是为什么我要编辑它,以包括一些幼稚方法的警告。@ChristianWitts你的解决方案工作,谢谢:)但是,如果我想避免替换其他字符串的单词片段,该如何做呢?@user47467使用正则表达式,如panda的回答中所示,用\b
表示“单词边界”,但我建议使用不同的正则表达式。。。请参阅注释。最好使用r“\b”(“+”|“)。将(单词列表)+r“\b”作为模式加入,
,这样就不会不必要地替换每个单词。另外,如果这些单词包含不寻常的字符,\w
将不起作用。@tobias_k,测试每个单词的N个变体是O(N),而不必要地替换它是O(1)(尽管可能需要更长的操作)。平衡点在哪里是一个貌相的问题。根据定义,w是一个单词符号。如果您有N个备选方案,则必须检查每个备选方案,直到找到正确的一个,regexp引擎无法执行任何其他操作。python集与dict没有区别,两者都是O(1)average@tobias_k,我在一本简陋的10000字字典上测试了它,果然,联接的regexp子操作的运行速度慢425倍
import re
word_list = {'hi' : 'test', 'how' : 'teddy'}
with open('document.txt') as main, open('done.txt', 'w') as done:
text = main.read()
done.write(re.sub(r'\b\w+\b', lambda x: word_list.get(x.group(), x.group()), text))