@ExplosionPills верна, но с вашим регулярным выражением все еще будет две проблемы.
Во-первых, $
соответствует концу строки. Я предполагаю, что вы захотите также извлечь int в середине строки, , например abcd123456efg789
, чтобы вернуть 123456
. Чтобы исправить это, вы хотите это:
r"[0-9]{4,7}(?![0-9])"
^^^^^^^^^
Добавленная часть представляет собой отрицательное утверждение look / head , означающее «... не сопровождаемое никакими номерами». Позвольте мне упростить это, используя \d
, хотя:
r"\d{4,7}(?!\d)"
. Это лучше. Теперь вторая проблема. У вас нет ограничений на левую часть вашего регулярного выражения, поэтому для строки, подобной abcd123efg123456789
, вы действительно сопоставляете 3456789
. Итак, вам нужно отрицательное утверждение lookbehind :
r"(?<!\d)\d{4,7}(?!\d)"
.match
будет соответствовать только если строка запускает с рисунком. Используйте .search
.
Вы также можете использовать:
re.findall(r"[0-9]{4,7}", teststring)
, который вернет список всех подстрок, соответствующих вашему регулярному выражению, в вашем случае ['123456']
Если вы интересуется только первой подобранной подстрокой, тогда вы можете записать это как:
next(iter(re.findall(r"[0-9]{4,7}", teststring)), None)