簡體   English   中英

如何在基於正則表達式的文件文本中替換字符串?

[英]How to replace string in a file text based on regex?

假設:

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>

我需要將基本版本和目標版本值按上述指定放置(請注意,在第二個和第三個條目上,基本版本和目標版本是相反的)。

我嘗試按照以下步驟進行操作,但是它不起作用:

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僅替換捕獲的組?

  1. 您正在使用打開文件a > - append 因此,您的更改應在文件末尾。 您應該創建一個新文件,並在腳本末尾替換old_one。
  2. 我只有一種方法知道是否要替換幾個匹配的組:首先,您使用regexp查找單詞並將其替換為不帶regexp的字符串。

感謝Jimilan的發言。 我修復了代碼,現在可以正常工作了:

        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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM