Negative lookahead assertion for all numbers and a quote is all that I think is needed"
user_re = re.compile('<a href(="/(?!(?:user/)?[0-9]+").+)"')
In [74]: [(url,user_re.match(url) and user_re.match(url).group(1)) for url in
['<a href="/user/15594243">',
'<a href="/user/15594243_">',
'<a href="/user/user15594243">',
'<a href="/user/1">',
'<a href="/user/15594243/add">',
'<a href="/item/15594243">',
'<a href="/a"',
'<a href="/15594243">']]
Out[74]:
[('<a href="/user/15594243">', None),
('<a href="/user/15594243_">', '="/user/15594243_'),
('<a href="/user/user15594243">', '="/user/user15594243'),
('<a href="/user/1">', None),
('<a href="/user/15594243/add">', '="/user/15594243/add'),
('<a href="/item/15594243">', '="/item/15594243'),
('<a href="/a"', '="/a'),
('<a href="/15594243">', None)]
EDIT: I know my last edit does the regex twice but that is just for display purposes.