Re: Replacing large number of substrings

2005-09-04 Thread Michael J. Fromberger
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

2005-09-04 Thread Robert Kern
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

2005-09-04 Thread tiissa
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

2005-09-04 Thread Will McGugan
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