簡體   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