【问题标题】:How to replace string in a file text based on regex?如何根据正则表达式替换文件文本中的字符串?
【发布时间】:2015-09-24 15:47:45
【问题描述】:

假设:

self.base_version = 1000
self.target_version = 2000

我有一个文件如下:

some text...
<tsr_args> \"upgrade_test test_mode=upgrade       base_sw=1000      target_sw=2000      system_profile=eth\"</tsr_args>

some text...

<tsr_args> \"upgrade_test test_mode=rollback      base_sw=2000      target_sw=1000      system_profile=eth      manufacture_type=no-manufacture\"</tsr_args>

some text...

<tsr_args> \"upgrade_test test_mode=downgrade     base_sw=2000      target_sw=1000      system_profile=eth      no_boot_next_enable_flag=True\"</tsr_args>

我需要按照上面指定的方式放置基本和目标版本值(请注意,在第 2 和第 3 个条目中,基本和目标是相反的)。

我尝试如下操作,但它不起作用:

base_regex   = re.compile('.*test_mode.*base_sw=(.*)')
target_regex = re.compile('.*test_mode.*target_sw=(.*)')

o = open(file,'a')

for line in open(file):
    if      'test_mode' in line:
        if     'upgrade' in line:
                new_line = (re.sub(base_regex, self.base_version, line))
                new_line = (re.sub(target_regex, self.target_version, line))
                o.write(new_line)

        elif   'rollback' in line or 'downgrade' in line):
               new_line = (re.sub(base_regex, self.target_version, line))
               new_line = (re.sub(target_regex, self.base_version, line))
               o.write(new_line)
o.close()

假设上述代码运行正常,没有任何语法错误。

  1. 文件根本没有被修改。

  2. 修改了整行,而不仅仅是捕获的组。如何使 re.sub 仅替换捕获的组?

【问题讨论】:

  • 我尝试运行你的代码并得到SyntaxError: invalid syntax。请提供minimal reproducible example
  • 我不能分享整个代码。假设上述运行没有任何语法错误。 o.write() 是覆盖当前行还是添加新行?
  • 而不是 (.*),如果它始终是数字,则使用 (\d*) 或非空格使用 (\S*)。 (.*) 表示除换行符以外的任何字符。
  • 如何使 re.sub 仅替换捕获的组?
  • 感谢“\S*”。我相应地修改了代码。

标签: python regex python-2.7


【解决方案1】:
  1. 您正在使用a -> append 打开文件。因此,您的更改应该在文件末尾。您应该创建一个新文件并在脚本末尾替换 old_one。
  2. 如果您想替换多个匹配的组,我知道只有一种方法:首先,您使用正则表达式找到单词,然后像没有正则表达式的字符串一样替换它。

【讨论】:

  • 我应该怎么做才能覆盖我当前替换的现有行?我应该用“w”打开它吗?
  • 如何使 re.sub 仅替换捕获的组?
  • @Qwerty, re.sub 仅替换组。我认为您的正则表达式可能过于宽泛。
【解决方案2】:

感谢吉米兰的发言。我修复了我的代码,现在它可以工作了:

        base_regex   = re.compile(.*test_mode.*base_sw=(\S*))
        target_regex = re.compile(.*test_mode.*target_sw=(\S*))

        for file in self.upgrade_cases_files_list:

            file_handle = open(file, 'r')
            file_string = file_handle.read()
            file_handle.close()

            base_version_result   = base_regex.search(file_string)
            target_version_result = target_regex.search(file_string)

            if base_version_result is not None:
                current_base_version = base_version_result.group(1)
            else:
                raise Exception("Could not detect base version in the following file: -> %s \n" % (file))

            if target_version_result is not None:
                current_target_version = target_version_result.group(1)
            else:
                raise Exception("Could not detect target version in the following file: -> %s \n" % (file))

            file_string = file_string.replace(current_base_version, self.base_version)
            file_string = file_string.replace(current_target_version, self.target_version)

            file_handle = open(file, 'w')
            file_handle.write(file_string)
            file_handle.close()

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多