对目录及其文件内容进行迭代。查找并替换精确匹配

2024-05-02 01:41:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个Python脚本,它迭代特定目录中的所有文件。它以只读模式打开文件,从XML文件中查找特定字符串,并相应地替换它们

问题是,例如,如果我想将“icon.png”更改为“bear.png”,脚本也将在“professional”icon.png”上运行,并将其替换为“professional”bear.png——这不是我想要实现的

import sys
import re
import os
import shutil
import xml.etree.cElementTree as ET


drc = '/home/user/Desktop/Convert_here'
backup = '/home/user/Desktop/Rename_icons/tmp_backup'
tree = ET.parse('list.xml')
root = tree.getroot()
records = []

for child in root:
    find = child.find('FINDEXACT').text
    replace = child.find('REPLACEEXACT').text
    records.append((find, replace))
            
    pattern = re.compile(find)
        
    for dirpath, dirname, filename in os.walk(drc):
        for fname in filename:
            path = os.path.join(dirpath, fname) 
            strg = open(path).read() 
            if re.search(pattern, strg):
                print path, strg
                shutil.copy2(path, backup) 
                strg = strg.replace(find, replace) 
                f = open(path, 'w') 
                f.write(strg) 
                f.close() 

list.xml

<SEARCH>
<SEARCHFOR>
    <FINDEXACT>icon.png</FINDEXACT>
    <REPLACEEXACT>bear.png</REPLACEEXACT>
</SEARCHFOR>
<SEARCHFOR>
    <FINDEXACT>professional_icon.png</FINDEXACT>
    <REPLACEEXACT>wolf.png</REPLACEEXACT>
</SEARCHFOR>
</SEARCH>

我试图将pattern = re.compile(find)更改为pattern = re.match(find, replace),但似乎根本不起作用。是否有办法更改此脚本,使其仅适用于精确匹配

任何帮助都将不胜感激


1条回答
网友
1楼 · 发布于 2024-05-02 01:41:18

似乎只有在匹配前面紧跟着非单词字符或字符串开头时才需要进行替换。因此:

用作正则表达式:

find = r'\b' + child.find('FINDEXACT').text

然后应该使用正则表达式替换:

strg = pattern.sub(replace, strg)

您还应该关闭输入文件

相关问题 更多 >