Это похоже на номер телефона и информацию о добавочном номере. Почему бы не упростить ситуацию для себя (и любого, кто должен прочитать это позже) и разделить ввод, а не использовать сложное регулярное выражение?
s = '999-123-222-...-22&Ns=12'
parts = s.split('&Ns=') # splits on Ns and removes it
Если перед номером «&» указан номер телефона, вы можете сделать еще одно разделение и получить код города и т. Д. В отдельных полях, например:
phone_parts = parts[0].split('-') # breaks up the digit string and removes the '-'
area_code = phone_parts[0]
Часть, найденная после необязательных '& Ns= 'можно проверить, является ли он числовым, с помощью строкового метода isdigit, который будет возвращать значение true, если все символы в строке являются цифрами и имеется хотя бы один символ, в противном случае - значение false.
if len(parts) > 1:
extra_digits_ok = parts[1].isdigit()