【问题标题】:Replacing string between two characters in the file替换文件中两个字符之间的字符串
【发布时间】:2020-03-08 05:05:58
【问题描述】:

我的属性文件中有一个字符串,如下所示:

line = "variables=ORACLE_BASE_HOME=/u02/test/oracle/landscape/1/db_50,DB_UNIQUE_NAME=cdms,ORACLE_BASE=//u02/test,PDB_NAME=,DB_NAME=cdms,ORACLE_HOME=/u02/test/product/19/db_21,SID=ss"

我想用不同的值替换以下字符串:

DB_NAME=cdms -> DB_NAME=abc

我有下面的代码,但是,它似乎没有按预期进行:

f = fileinput.FileInput(rsp_file_path)
for line in f:
    re.sub(",DB_NAME=(.*?),", "abc", line, flags=re.DOTALL)
f.close()

【问题讨论】:

  • “它似乎没有按预期进行”:请解释一下这是什么意思。
  • 嗨@Scott Hunter,文件/值没有更新。旧值仍然保留
  • 您是否阅读了re.sub 上的文档以了解它的作用,更重要的是,它返回了什么?

标签: python regex python-re


【解决方案1】:

应该是:

re.sub("(,DB_NAME=)(.*?),", "\g<1>abc,", line, flags=re.DOTALL)

或使用原始字符串:

re.sub(r"(,DB_NAME=)(.*?),", r"\1abc,", line, flags=re.DOTALL)

这是因为 documentation 对应于 re.sub() 声明:

在字符串类型的 repl 参数中,除了字符转义 和上面描述的反向引用,\g 将使用子字符串 由名为 name 的组匹配,由 (?P...) 定义 句法。 \g 使用对应的组号; \g 是 因此等价于 \2,但在替换中没有歧义 作为 \g0。 \20 将被解释为对第 20 组的引用,而不是 引用第 2 组,后跟文字字符“0”。这 反向引用 \g 替换与匹配的整个子字符串 回复。

在您的情况下,(,DB_NAME=) 是您使用\g&lt;1&gt; 引用的第一个捕获组。

【讨论】:

  • 这是否仍然受到“文件/值没有得到更新。旧值仍然保留”的影响?
  • @jignatius。感谢您指出这一点,应该仔细检查。
【解决方案2】:

你可以使用 string.replace()

s.replace('DB_NAME', 'cdms', 1).replace('DB_NAME', 'abc', 1)

【讨论】:

  • 正如问题中的正则表达式清楚地表明,希望替换 whatever 值被分配给DB_NAME。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2021-07-23
  • 2019-12-25
  • 2020-06-26
  • 2018-08-25
相关资源
最近更新 更多