关于python:用re替换文件中的单词

Replacing words in a file with re

我有一个函数,它迭代文本文件,将单词与字典中的键匹配,并将这些单词更改为键值:

1
2
3
4
5
6
7
8
9
10
11
12
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: expected string or bytes-like object

我已经尝试了在清理行中用str(f)替换f的解决方案(这个答案建议),但是这只会将以下行写入我的outfile:

<_io.TextIOWrapper"name"='path/of/outfile' mode='w' encoding='cp1252'>

有没有人知道如何在不出现这种错误的情况下添加更多密钥?


你不需要循环,或替换&amp;多次写文件。一种非常有效的方法是:

  • 开放式读取文件
  • 使用带有lambda的正则表达式替换函数,尝试将文本的单词与字典匹配,如果找不到则返回相同的单词
  • 开放式写文件(或新文件)

像这样:

1
2
3
4
5
6
7
8
9
10
11
12
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):

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

因此,如果匹配的单词在字典中,则返回&amp;替换值,否则返回原始单词。

所有这一切都没有循环&amp; O(1)单词查找,即使您的词典中有很多项目也是超级快速的(与线性第n次替换方法相反,或者建立"|".join()的关键字列表,当您有1000多个项目时,它会开始爬行查找/替换)