Well, the first two substrings aren't too difficult:
import re
s = 'street'; a = 'avenue'; b = 'boulevard'
re.sub(r'(str)eet|(ave)nue|(boulevard)', r'\1 \2 \3', s)
re.sub(r'(str)eet|(ave)nue|(boulevard)', r'\1 \2 \3', a)
re.sub(r'(str)eet|(ave)nue|(boulevard)', r'\1 \2 \3', b)
The last three lines return matches plus white space for the groups that weren't matched. I think one may have to do further processing on the string in order to get 'blvd' from 'boulevard' were it to be captured by the above regex. That's reasonable though, since extracting a set of substrings from 'boulevard' is a separate issue from capturing and replacing one of a set of alternate regexes.
Perhaps, since this way already requires the extra step of removing whitespace, one could do something like this:
#with boulevard
new_str = re.sub(r'(str)eet|(ave)nue|(b)oulevard', r'\1 \2 \3lvd', b)
re.sub(r'\s+|\blvd', '', new_str)
#with avenue
new_str = re.sub(r'(str)eet|(ave)nue|(b)oulevard', r'\1 \2 \3lvd', a)
re.sub(r'\s+|\blvd', '', new_str)
The code looks kinda funny though.