Search and replace in a text.

Paul McGuire ptmcg at austin.rr._bogus_.com
Tue Oct 5 08:29:42 EDT 2004


On 10/1, Dong Ge wrote:
>I'm a new beginner of Python. I want to convet
> "Text 1" to "Text 2"
> below. How to do it?
>
>__
>Dong Ge
>2004.10.01
>
>Text 1:
>...
>Layer: Tv-Frame
>Flags: 0x0
>Attr: 1  (replace "1" with contents of previous
>          "Layer" line - "Tv-Frame")
<snip>

This kind of adaptive search/replace is a good option for pyparsing
transformString.  Using this mode, one only needs to define the patterns to
be matched, and in the case of substitution, return the desired output
string in the appropriate parseAction routine.

--------------------------
from pyparsing import *

# define relevant grammar strings
layerDefn = "Layer:" + restOfLine
attrDefn = "Attr:" + Word(nums)
searchPatterns = ( layerDefn | attrDefn )

# initialize layerData in case we get an Attr before a Layer
layerData = "<ERROR> no layer found"

# define parse action to run when encounter "Layer"
def saveLayerData(strg,loc,tokens):
    global layerData
    layerData = tokens[1].strip()
layerDefn.setParseAction( saveLayerData )

# define parse action to run when encounter "Attr"
def pasteLayerData(strg,loc,tokens):
    return "Attr: " + layerData
attrDefn.setParseAction( pasteLayerData )

# test results
testdata = """
Layer: Tv-Frame
Flags: 0x0
Attr: 1
Focus Point: 0 0 0
Layer: Tv-pic
Flags: 0x2300
Attr: 1
Focus Point: 0 0 0
Layer: Tv-shell
Flags: 0x0
Attr: 1
Focus Point: 0 0 0
"""

print searchPatterns.transformString( testdata )
--------------------------
(output)
Layer: Tv-Frame
Flags: 0x0
Attr: Tv-Frame
Focus Point: 0 0 0
Layer: Tv-pic
Flags: 0x2300
Attr: Tv-pic
Focus Point: 0 0 0
Layer: Tv-shell
Flags: 0x0
Attr: Tv-shell
Focus Point: 0 0 0



-- Paul McGuire
Download pyparsing at http://pyparsing.sourceforge.net






More information about the Python-list mailing list