【问题标题】:re.search not able to find the regex pattern inside a filere.search 无法在文件中找到正则表达式模式
【发布时间】:2019-05-02 04:12:11
【问题描述】:

我有如下测试文件(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)

【问题讨论】:

  • 您需要转义您尝试匹配的文字 (
  • 执行替换后,您实际上并没有对线路做任何事情。
  • 谢谢,但这只是复制粘贴和编辑过程中的一个错字。转义后我仍然有同样的问题 '('

标签: python regex python-3.x file


【解决方案1】:

正如 cmets 中提到的,您不是在编写文件。

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

最后,你正在执行re.match re.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)

*注意:更复杂但并不困难

【讨论】:

  • 谢谢,这是最有效的解决方案。我会接受这个作为答案。
【解决方案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))

【讨论】:

    猜你喜欢
    • 2019-10-01
    • 2020-08-12
    • 1970-01-01
    • 2012-02-18
    • 2013-03-24
    • 2021-08-12
    • 2015-08-02
    • 2014-08-20
    • 1970-01-01
    相关资源
    最近更新 更多