How to replace multiple-line text

David Lees debl2nonospammyyy at bellatlantic.net
Thu Jul 11 21:49:31 EDT 2002


Thank you kindly Alex for this solution.  This is the problem that I had
in mind.  You also taught me something rather basic about Python that I
misunderstood  I thought that to use string methods I needed to import
the string class and then use it like this:

>>> import string
>>> x='this is junk'
>>> string.replace(x,'junk','stuff')
'this is stuff'

Time to do some more reading on classes, since I don't understand why it
is not necessary to import string here.



Alex Martelli wrote:
> 
> David Lees wrote:
> 
> > I would like to process a code file and substitute one multiline block
> > of code for another.  I know how to do this in Python by brute force
> > scanning through on a line by line basis until the first line of the
> > pattern is found then looping over the rest of the lines in the target
> > pattern for a match, then substituting in an output string multiline
> > substitution.  But I am sure there is a neater solution, perhaps using
> > regular expressions.  Could someone point me towards sample code or
> > something similar that I could modify.
> 
> The simplest approach, a step-by-step example for clarity:
> 
> old_lines = """Tyger, tyger, burning bright
> in the forests of the night,
> what immortal hand or eye
> dare frame thy fearful symmetry?"""
> 
> new_lines = """Do not go gentle into that good night,
> Old age should burn and rave at close of day;
> Rage, rage against the dying of the light."""
> 
> old_file = open("oldfile.txt")
> old_text = old_file.read()
> old_file.close()
> 
> new_text = old_text.replace(old_lines, new_lines)
> # other changes to new_text, if needed, go here
> 
> new_file = open("oldfile.txt")
> new_file.write(new_text)
> new_file.close()
> 
> The only possible problem with this approach is that if the files
> involved are truly huge you might not have space in memory for the
> text involved (about twice as much as the file's size plus a little).
> 
> For a "code file" this is quite unlikely -- how many megabytes of
> code will there be even in a large such file, after all?  So, in
> practice, for the need you've expressed, this approach is almost
> surely the best one.
> 
> The theoretical problem in terms of substituting substreams of
> input streams on the fly is also interesting, but I doubt it's of
> much actual applicability to your case.
> 
> Not sure what regular expressions would have to do with the case.
> I see it as a case of bunching.  Matching multiline text, as long
> as you manage to get it in memory, is just as easy with string
> operations as with re's if it's an exact match you're lookin for --
> re's would be useful if you needed more sophisticated matching,
> but they still need the file's contents to be in memory.
> 
> Alex



More information about the Python-list mailing list