Ersetzen Sie einen Funktionsblock in einer Datei mit Python

Sep 04 2020

Ich habe einen Ruby-Funktionscodeblock in mehreren Dateien, den ich in jeder Datei ändern muss.

Die Funktion, die ich zu ersetzen versuche, sieht ungefähr so ​​aus:

    def func1 options
        ...
        some code here
        ...
        def inner_func1 inner_options
            ...
            some code here
            ...
        end
        ...
        some more code here
        ...
    end

Jede Datei enthält andere Funktionen, jedoch mit unterschiedlichen Namen. In einigen Dateien habe ich möglicherweise mehrere Tabulatoren oder Leerzeichen.

Ich möchte die func1in jeder Datei durch Inhalte ersetzen, die aus einer anderen Datei gelesen werden (die eine Variable sein kann, die im Parameter übergeben wird).

Bisher habe ich die folgende Python-Funktion geschrieben, damit sich eine solche Datei ändert:

import re

a = open('main.rb').read() # file where I have the func1
b = open('modified.rb').read() # file where I have only the modified func1 

c = re.sub('(^[ \t]*)def func1:$.?\1end$',b,a, flags=re.DOTALL)

print(c)

with open('main.rb', 'w') as filetowrite:
    filetowrite.write(c)
        

Meine cZeichenfolge zeigt jedoch nicht, dass an irgendetwas etwas geändert wurde.

Ich bin mir nicht sicher, ob mit meiner Regex etwas nicht stimmt.

Antworten

1 Liju Sep 04 2020 at 18:04

Bitte versuchen Sie es unter Regex

(?:^|\n)([\t ]*?)def func1 options[\s\S]*?\n\1end

Code

import re

input="""
def func1 options
    some code here
    def inner_func1 inner_options
        some code here
    end
    some more code here
end
"""

replacement="""
def new_func1 options
    new code here
end
"""

print(re.sub(r"(?:^|\n)([\t ]*?)def func1 options[\s\S]*?\n\1end",replacement,input),end='')

Ausgabe

def new_func1 options
    new code here
end

Regex-Demo | Python-Demo