Регулярное выражение для выделения последнего встречающегося числа с использованием Python

У меня есть регулярное выражение, которое отделяет число от данной строки.

username = "testuser1" xp = r'^\D+' ma = re.match(xp, username) user_prefix = ma.group(0) print user_prefix 

выход

 testuser 

Но если имя пользователя что-то вроде ниже

 username = "testuser1-1" 

Я получаю следующий результат

 testuser 

что ожидается. Но я ищу следующие

 testuser1- 

В основном регулярное выражение должно выделять последнее встречающееся целое число (а не отдельные цифры).

Резюме

 input = "testuser1" >>> output = testuser input = "testuser1-1" >>> output = testuser1- input = "testuser1-2000" >>> output = testuser1- 

Могу ли я иметь одно регулярное выражение для решения всех вышеперечисленных случаев?

Вы можете использовать re.sub и посмотреть за синтаксисом:

 re.sub(r'(?<=\D)\d+$', '', username) 

Более короткая версия:

 re.sub(r'\d+$', '', username) 

sub больше подходит для этого случая.

Тестовые случаи:

 re.sub(r'\d+$', '', "testuser1-100") # 'testuser1-' re.sub(r'\d+$', '', "testuser1-1") # 'testuser1-' re.sub(r'\d+$', '', "testuser1") # 'testuser' 

Решение, использующее re.match:

 import re username = "testuser1" xp = r'^(.+?)\d+$' ma = re.match(xp, username) user_prefix = ma.groups()[0] user_prefix # 'testuser' # you can also capture the last number xp = r'^(.+?)(\d+)$' ma = re.match(xp, username) user_prefix, user_number = ma.groups() user_prefix, user_number # ('testuser', '1') print re.match(xp, "testuser1-2000").groups() # ('testuser1-', '2000') re.match(xp, "testuser1-2000").groups()[0] # 'testuser1-' re.match(xp, "testuser1-2000").group(1) # 'testuser1-' 

Меньше двигателя с регулярным выражением (учитывая - как единственный токен)

 ^([^\s-]+-|\D+) 

Вот!

 regex_ = '\w+-?(?:\d+)?' 

Я предлагаю начать с конца, удаляя каждый символ и останавливаясь при первом нечислении.