469,362 Members | 2,580 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,362 developers. It's quick & easy.

How to use python regular expression to substitute string value

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.

Feb 26 '06 #1
7 3018
Al************@gmail.com writes:
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]
- -

--
Psi -- <http://www.iki.fi/pasi.savolainen>
Feb 26 '06 #2
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()

Feb 26 '06 #3
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 'rect x="11" y="0" width="760" height="19"'


Feb 26 '06 #4
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.

Feb 26 '06 #5
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:
s = """ .... abc
.... def
.... xyz""" s.split('\n')

['', 'abc', 'def', 'xyz']

Feb 26 '06 #6
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?

Feb 26 '06 #7
Al************@gmail.com writes:
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
- -

--
Psi -- <http://www.iki.fi/pasi.savolainen>
Feb 26 '06 #8

This discussion thread is closed

Replies have been disabled for this discussion.

By using this site, you agree to our Privacy Policy and Terms of Use.