繁体   English   中英

用re替换文件中的单词

[英]Replacing words in a file with re

我有一个遍历文本文件的功能,将单词与字典中的键匹配,并将这些单词更改为键值:

def replace_operators(text):
    operators = {'order': '"order"'}
    f = open(text, 'r').read()

    for k, v in operators.items():
        cleaned = re.sub(r"\b%s\b" % k, v, f)
        f = open(text, 'w')
        f.truncate(0)
        f.close()
        text_file = open(text, 'w')
        text_file.write(cleaned)
        text_file.close()

这很好用,但是当我在字典中添加另一个键时,我收到:

TypeError:预期的字符串或类似字节的对象

我尝试过在清除的行中用str(f)替换f的解决方案( 答案建议),但这仅将以下行写入我的输出文件:

<_io.TextIOWrapper“名称” ='路径/输出文件'模式='w'编码='cp1252'>

有谁知道我如何添加更多密钥而不出现这种错误?

您不需要为此执行循环,也不需要多次替换和写入文件。 一种非常有效的方法是:

  • 打开并读取文件
  • 将正则表达式替换功能与lambda配合使用,尝试将文本的单词与字典进行匹配,如果未找到则返回相同的单词
  • 打开并写入文件(或新文件)

像这样:

import re

text = "input.txt"

operators = {'order': '"order"', 'matter':'"matter"'}
with open(text, 'r') as f:
    contents = f.read()

cleaned = re.sub(r"\b(\w+)\b",lambda m : operators.get(m.group(1),m.group(1)),contents)

with open("new_"+text, 'w') as f:
    f.write(cleaned)

这个鲜为人知的功能非常强大。 它允许传递一个函数作为替换(不是字符串)。 此函数将匹配项作为输入,并返回必须替换匹配项的字符串作为输出。 我的函数是一个匿名函数(lambda):

lambda m : operators.get(m.group(1),m.group(1))

因此,如果匹配的单词在词典中,它将返回并替换为该值,否则它将返回原始单词。

所有这些都无需循环和O(1)单词查找,因此即使您词典中有很多项也是如此超快(相对于线性nth替换方法,或使用"|".join()构建关键字列表,当您有1000多个要搜索/替换的项目时,它会开始抓取)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM