Ответ 1
Добавьте границы слова:
import re
result = re.findall(r'\b\d{1,3}\b', '1 2 134 2009')
print(result)
Выход
['1', '2', '134']
Из документации \b
:
Соответствует пустой строке, но только в начале или конце слова. Слово определяется как последовательность символов слова. Обратите внимание, что формально, \b определяется как граница между символами \w и\W (или наоборот), или между \w и началом/концом строки. Это означает, что r '\ bfoo\b' соответствует 'foo', 'foo.', '(Foo)', 'bar foo baz', но не 'foobar' или 'foo3'.
По умолчанию буквенно-цифровые символы Юникода используются в шаблонах Юникода, но это можно изменить с помощью флага ASCII. Границы слова определяются текущей локалью, если используется флаг LOCALE. Внутри символьного диапазона \b представляет символ возврата, для совместимости со строковыми литералами Pythons.