Поиск целых и вещественных чисел
Всем привет. Помогите, пожалуйста с регулярными выражениями. Пытаюсь составить регулярное выражение, чтобы можно было выбирать целые или дробные числа от 0 до 99, содержащие не более 2 символов после точки.
import re
result = re.findall(r'\d{1,2}\.{1}\d{1,2}\b|\b\d{1,2}\.{0}\b', '10 rew 14.03 ytr 123 dsffd 15.443 er')
print(result)
Данный код выводит ответ
['10', '14.03', '15']
а надо
['10', '14.03']
Не могу понять, как сделать это правильно.
Ответы (1 шт):
Автор решения: Wiktor Stribiżew
→ Ссылка
Используйте
import re
pattern = r'(?<!\d)(?<!\d\.)\d{1,2}(?:\.\d{1,2})?(?!\.?\d)'
print(re.findall(pattern, '10 rew 14.03 ytr 123 dsffd 15.443 er', re.ASCII))
# => ['10', '14.03']
См. пример работы программы на Python. Выражение находит
(?<!\d)- место в строке, сразу перед которым нет цифры(?<!\d\.)- место в строке, сразу перед которым нет последовательности "цифра + точка"\d{1,2}- одна или две цифры(?:\.\d{1,2})?- необязательная последовательность "точка + одна или две цифры"(?!\.?\d)- сразу после текущей позиции не должно быть точки и цифры или просто цифры.
Благодаря флагу re.ASCII шаблон \d находит цифры из набора 0-9.
См. пример работы регулярного выражения.
Ещё один вариант выражения с границами слова:
\b(?<!\d\.)\d{1,2}(?:\.\d{1,2})?\b(?!\.\d)