Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python string replacement with random items

String replacement in Python is not difficult, but I want to do something special:

teststr = 'test test test test'
animals = ['bird','monkey','dog','fox']
#replace 'test' with random item from animals
finalstr = ['dog fox dog monkey']

I write a very inefficient version:

from random import choice
import string
import re

teststr = 'test test test test'
animals = ['bird','monkey','dog','fox']

indexes = [m.start() for m in re.finditer('test', 'test test test test')]
#indexes = [0, 5, 10, 15]
for i in indexes:
    string.replace(teststr, 'test', choice(animals), 1)

#Final result is four random animals
#maybe ['dog fox dog monkey']

It works, but I believe there is some simple method with REGULAR EXPRESSION which I am not familiar with.

like image 641
Gaby Solis Avatar asked Sep 16 '12 18:09

Gaby Solis


2 Answers

Use a re.sub callback:

import re
import random

animals = ['bird','monkey','dog','fox']

def callback(matchobj):
    return random.choice(animals)

teststr = 'test test test test'
ret = re.sub(r'test', callback, teststr)
print(ret)

yields (for example)

bird bird dog monkey

The second argument to re.sub can be a string or a function (i.e. a callback). If it is a function, it is called for every non-overlapping occurrance of the regex pattern, and its return value is substituted in place of the matched string.

like image 171
unutbu Avatar answered Oct 08 '22 11:10

unutbu


You can use re.sub:

>>> from random import choice
>>> import re
>>> teststr = 'test test test test'
>>> animals = ['bird','monkey','dog','fox']
>>> re.sub('test', lambda m: choice(animals), teststr)
'fox monkey bird dog'
>>> re.sub('test', lambda m: choice(animals), teststr)
'fox dog dog bird'
>>> re.sub('test', lambda m: choice(animals), teststr)
'monkey bird monkey monkey'
like image 36
sloth Avatar answered Oct 08 '22 10:10

sloth