Это должно быть легко в Beautiful Soup.
Что-то вроде:
from BeautifulSoup import BeautifulSoup
from BeautifulSoup import Tag
count = 1
links_dict = {}
soup = BeautifulSoup(text)
for link_tag in soup.findAll('a'):
if link_tag['href'] and len(link_tag['href']) > 0:
links_dict[count] = link_tag['href']
newTag = Tag(soup, "a", link_tag.attrs)
newTag.insert(0, ''.join([''.join(link_tag.contents), "[%s]" % str(count)]))
link_tag.replaceWith(newTag)
count += 1
Результат выполнения этого над вашим текстом:
>>> soup
<p>
<a href="http://www.foo.com">this if foo[1]</a>
<a href="http://www.bar.com">this if bar[2]</a>
</p>
>>> links_dict
{1: u'http://www.foo.com', 2: u'http://www.bar.com'}
Единственная проблема, которую яМожно предусмотреть с помощью этого решения, если ваш текст ссылки содержит подтэги;тогда ты не сможешь сделать ''.join(link_tag.contents)
;вместо этого вам нужно перейти к крайнему правому текстовому элементу.