首页 > 解决方案 > 使用正则表达式替换文件中的单词

问题描述

我有一个包含超过 40k 行的文件,我需要在其中替换单词,使用正则表达式的行。我不能让它自己工作。假设文件看起来像:

test >
test >
test >
test >
def start():
        file = input("file: ")
        fread = open(file, "r")
        linelist = fread.readlines()
        fread.close()
        fwrite = open(file, "w")
        line = re.sub(".*(?=>)", " ", str(linelist))
        fwrite.write(line)
        fwrite.close()


start()

但不是删除测试并给我:

>
>
>

它给了我

  >\n']

没有其他线路

标签: pythonregex

解决方案


linelist是 a list,您将其转换为字符串,导致re.sub在 last 之前删除所有内容>\n]。当您str在列表上运行时,您会得到例如:

In [1]: str([1, 2])
Out[1]: '[1, 2]'

这是主要问题。您需要的是遍历列表并分别对每一行进行操作并保存修改后的行。

但是有一个比spiltlines文件对象更好的方法来获取单个列表中的所有行;由于您的文件很大,这将产生巨大的内存成本。

另外,我建议您在对文件的每一行进行操作时使用单独的文件进行读取和写入,然后再写回同一个文件。如果您必须使用同一个文件,我会使用单独的文件,然后shutil.move在操作完成后将读取的文件替换为写入文件。

所以总的来说,更好的方法是遍历文件对象(因为它是一个迭代器)并执行操作:

with open('input_file') as in_file, open('output_file', 'w') as out_file:
    for line in in_file:
        modified_line = re.sub(r'^.*(?=>)', ' ', line)
        out_file.write(modified_line)

open是一个上下文管理器,因此您可以在其上使用withstatememnt,它具有调用close文件对象的额外好处,因此您无需手动关闭它们。

如果您的模式与示例中显示的方式完全相同,则可以使用str.replace,而无需正则表达式:

modified_line = line.replace('test ', ' ')

推荐阅读