How to use python regular expression to substitute string value

A

Allerdyce.John

Hi,
I am new to python. I would like to know how to use python regular
expression to substitute string value?
I have an input string like this:
x:11 y:0 w:760 h:19 area:14440 areaPerCent:0
totalAreaPerCent:-3.08011e+16 type:3 path:///-/1/1

and I would like to convert it to:
rect x="11" y="0" width="760" height="14440"

all I care about the input string is x, y, w, h.

Thank you for any pointers.
 
P

Pasi Savolainen

Hi,
I am new to python. I would like to know how to use python regular
expression to substitute string value?
I have an input string like this:
x:11 y:0 w:760 h:19 area:14440 areaPerCent:0
totalAreaPerCent:-3.08011e+16 type:3 path:///-/1/1

and I would like to convert it to:
rect x="11" y="0" width="760" height="14440"

all I care about the input string is x, y, w, h.

I'd say you're better off with 'findall':
- -
import re
line = "x:11 y:0 w:760 h:19 area:14440 areaPerCent:0 totalAreaPerCent:-3.08011e+16 type:3 path:///-/1/1"
pattern = "x:(\d+) y:(\d+) w:(\d+) h:(\d+) area:(\d+)"
x, y, width, height, area = re.findall(pattern, line)[0]
print "rect x=\"%(x)s\" y=\"%(y)s\" width=\"%(width)s\" height=\"%(height)s\" ..." % locals()
- -

x .. area are strings when they come out of findall, so you may want to:
- -
x .. area = map (lambda x: int(x), re.findall (pattern, line)[0]
- -
 
A

Allerdyce.John

Thanks. But i don't understand why I need to do this:
x. . area = map (lambda x: int(x), re.findall (pattern, line)[0]

if i have the value already by doing this:
x, y, width, height, area = re.findall(pattern, line)[0]
print "rect x=\"%(x)s\" y=\"%(y)s\" width=\"%(width)s\"
height=\"%(height)s\" ..." % locals()
 
C

Crutcher

You don't really need regexes for this.

Assuming there is no whitespace in any of your values, it should be
really easy to parse the string.

s = 'x:11 y:0 w:760 h:19 area:14440 areaPerCent:0
totalAreaPerCent:-3.08011e+16 type:3 path:///-/1/1'

s.split() # break the string on whitespace
['x:11', 'y:0', 'w:760', 'h:19', 'area:14440', 'areaPerCent:0', 'totalAreaPerCent:-3.08011e+16', 'type:3', 'path:///-/1/1']

[ t.split(':',1) for t in s.split() ] # break each term on the first
':'
[['x', '11'], ['y', '0'], ['w', '760'], ['h', '19'], ['area', '14440'], ['areaPerCent', '0'], ['totalAreaPerCent', '-3.08011e+16'], ['type', '3'], ['path', '///-/1/1']]

d = dict([ t.split(':',1) for t in s.split() ]) # make a dict of the
list
{'type': '3', 'area': '14440', 'h': '19', 'w': '760', 'areaPerCent': '0', 'y': '0', 'x': '11', 'path': '///-/1/1', 'totalAreaPerCent': '-3.08011e+16'}

Now you can do this:
new_s = 'rect x="%(x)s" y="%(y)s" width="%(w)s" height="%(h)s"' % d
 
A

Allerdyce.John

okay, but I have a simpler question, how can I split using only "\n"?

I try this:
strings = node.data.split("\n");
print node.data

for str in strings:
print str

where node.data has multiple lines, but in the for loop, I don't see
str gets print out.
 
C

Crutcher

Are you sure node.data contains newlines?
You could try just:
print node.data
print node.data.split('\n')

This should give you an idea. From the interpreter:.... abc
.... def
.... xyz"""['', 'abc', 'def', 'xyz']
 
A

Allerdyce.John

When I try your idea, I have this error

x, y, width, height = re.findall(pattern, str)[0]
IndexError: list index out of range

How can I use findall to handle error case? i.e. what if there is no
match? how can I handle it gracefully?
 
P

Pasi Savolainen

When I try your idea, I have this error

x, y, width, height = re.findall(pattern, str)[0]
IndexError: list index out of range

How can I use findall to handle error case? i.e. what if there is no
match? how can I handle it gracefully?

This is explained in python docs, and do try them in interactive python,
for example IPython is great for this stuff.

- -
ipython ->

In [1]:import re

In [2]:line = "foobar"

In [3]:re.findall ("baz", line)
Out[3]:[]

In [4]:re.findall ("o", line)
Out[4]:['o', 'o']
- -

So you can do:
- -
match = re.findall(pattern, str)
if match:
x, y, width, height = match[0]
...
else:
# no match
- -
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,571
Members
45,045
Latest member
DRCM

Latest Threads

Top