By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
425,529 Members | 1,860 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 425,529 IT Pros & Developers. It's quick & easy.

Replacing large number of substrings

P: n/a
Hi,

Is there a simple way of replacing a large number of substrings in a
string? I was hoping that str.replace could take a dictionary and use it
to replace the occurrences of the keys with the dict values, but that
doesnt seem to be the case.

To clarify, something along these lines..
dict_replace( "a b c", dict(a="x", b="y") )

"x y c"
Regards,

Will McGugan
--
http://www.kelpiesoft.com
Sep 4 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
Will McGugan wrote:
Hi,

Is there a simple way of replacing a large number of substrings in a
string? I was hoping that str.replace could take a dictionary and use it
to replace the occurrences of the keys with the dict values, but that
doesnt seem to be the case.


You can look at the re.sub [1] and try:

d={'a':'x', 'b':'y'}

def repl(match):
return d.get(match.group(0), '')

print re.sub("(a|b)", repl, "a b c")
>>> dict_replace( "a b c", dict(a="x", b="y") ) "x y c"


Above, I gave the pattern myself but you can try to have it generated
from the keys:
def dict_replace(s, d):
pattern = '(%s)'%'|'.join(d.keys())
def repl(match):
return d.get(match.group(0), '')
return re.sub(pattern, repl, s)
On your example, I get:
dict_replace('a b c', {'a': 'x', 'b': 'y'}) 'x y c'


[1] http://python.org/doc/2.4.1/lib/node114.html
Sep 4 '05 #2

P: n/a
Will McGugan wrote:
Hi,

Is there a simple way of replacing a large number of substrings in a
string? I was hoping that str.replace could take a dictionary and use it
to replace the occurrences of the keys with the dict values, but that
doesnt seem to be the case.

To clarify, something along these lines..
>>> dict_replace( "a b c", dict(a="x", b="y") )

"x y c"


(n.b. untested!)

def dict_replace(string, replacements):
for key, value in replacements.iteritems():
string = string.replace(key, value)
return string

How well this works depends on how large is "large." If "large" is
really very large, then you might want to build something using a more
suitable algorithm like the Aho-Corasick algorithm.

http://www.lehuen.com/nicolas/download/pytst/
http://hkn.eecs.berkeley.edu/~dyoo/python/ahocorasick/

--
Robert Kern
rk***@ucsd.edu

"In the fields of hell where the grass grows high
Are the graves of dreams allowed to die."
-- Richard Harter

Sep 4 '05 #3

P: n/a
In article <43***********************@news.zen.co.uk>,
Will McGugan <ne**@NOwillmcguganSPAM.com> wrote:
Hi,

Is there a simple way of replacing a large number of substrings in a
string? I was hoping that str.replace could take a dictionary and use it
to replace the occurrences of the keys with the dict values, but that
doesnt seem to be the case.

To clarify, something along these lines..
>>> dict_replace( "a b c", dict(a="x", b="y") )

"x y c"


Hi, Will,

Perhaps the following solution might appeal to you:

.. import re
..
.. def replace_many(s, r):
.. """Replace substrings of s. The parameter r is a dictionary in
.. which each key is a substring of s to be replaced and the
.. corresponding value is the string to replace it with.
.. """
.. exp = re.compile('|'.join(re.escape(x) for x in r.keys()))
.. return exp.sub(lambda m: r.get(m.group()), s)

Cheers,
-M

--
Michael J. Fromberger | Lecturer, Dept. of Computer Science
http://www.dartmouth.edu/~sting/ | Dartmouth College, Hanover, NH, USA
Sep 4 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.