Re: Replacing large number of substrings
In article <[EMAIL PROTECTED]>, Will McGugan <[EMAIL PROTECTED]> 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 -- http://mail.python.org/mailman/listinfo/python-list
Re: Replacing large number of substrings
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 [EMAIL PROTECTED] "In the fields of hell where the grass grows high Are the graves of dreams allowed to die." -- Richard Harter -- http://mail.python.org/mailman/listinfo/python-list
Re: Replacing large number of substrings
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 -- http://mail.python.org/mailman/listinfo/python-list
Replacing large number of substrings
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 -- http://mail.python.org/mailman/listinfo/python-list