re.search不能在文件中找到正则表达式模式

5

我有一个测试文件(test.txt),内容如下:

`RANGE(vddout,sup)

`RANGE(vddin,sup_p) 

我想将此文件修改如下:
`RANGE(vddout,sup,tol_sup)

`RANGE(vddin,sup_p,tol_sup_p)

这是我尝试的代码,但它无法使用re.search查找和替换模式。您能指出代码中的缺陷吗?

 with open("test.txt", 'r+') as file :
    for line in file:
        print("line={}".format(line))
        findPattern=re.search(r'(`RANGE\(\w+,(\w+))\)',line)
        if findPattern:
            print("findPattern={}".format(findPattern))
            line=re.sub(r'(`RANGE\(\w+,(\w+))\)',r'\1,tol_\2',line)

1
你需要转义要匹配的字面上的 ( - dawg
1
你在进行替换后实际上没有对该行执行任何操作。 - jasonharper
谢谢,但那只是复制粘贴和编辑时的一个错字。我在逃避“(”后仍然遇到同样的问题。 - sanforyou
2个回答

2

这应该可以实现。(您不必先搜索再替换。您可以直接尝试替换。只有在第一次匹配时才会替换)

import re

with open("test.txt", 'r+') as file :
    for line in file:
        print(line)
        print(re.sub(r'`RANGE\((\w+),(\w+)\)', r'`RANGE(\1,\2,tol_\2)`', line))

2

如评论中所述,您没有写入文件。

此外,您正在逐行阅读每一行,而实际上您可以将整个文件作为字符串读取以执行操作。这既效率低(因为您需要多次执行re.sub),而且编码更加复杂*(因为您需要创建一个新字符串来写入文件)。

最后,您执行了re.matchre.sub。这是不必要的,因为如果没有匹配,re.sub将什么也不做;您不需要先进行检查。

In [188]: with open('test.txt', 'r+') as f:
     ...:     data = f.read()
     ...:     updated = re.sub(r'(`RANGE\(\w+,(\w+))', r'\1,tol_\2', data)
     ...:     f.seek(0)         # Start writing at the beginning of the file
     ...:     f.write(updated)

*注:更复杂但不难

谢谢,这是最高效的解决方案。我会接受这个答案。 - sanforyou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接