Dùng capturing group để tách phần nguyên và phần thập phân của số thực.
Ví dụ
import re
# Pattern: (\d+) phần nguyên, \. dấu chấm, (\d+) phần thập phân
m = re.match(r'(\d+)\.(\d+)', '80.3196')
if m:
print(m.groups()) # ('80', '3196')
print('Phần nguyên:', m.group(1)) # '80'
print('Phần thập phân:', m.group(2)) # '3196'
Kết quả
('80', '3196')
Phần nguyên: 80
Phần thập phân: 3196
Mở rộng: Hỗ trợ dấu âm/dương, số không có phần nguyên
# Pattern đầy đủ cho số thực (bao gồm khoa học)
float_pattern = r'[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?'
# Chỉ lấy phần nguyên (trước dấu chấm hoặc toàn bộ nếu int)
int_part_pattern = r'[+-]?(\d+)(?:\.\d*)?'
tests = ['80.3196', '-12.5', '.75', '42', '+3.14']
for t in tests:
m = re.match(int_part_pattern, t)
if m:
print(f'{t} -> integer part: {m.group(1)}')
Kết quả
80.3196 -> integer part: 80
-12.5 -> integer part: 12
.75 -> integer part: (không khớp - cần điều chỉnh pattern)
42 -> integer part: 42
+3.14 -> integer part: 3
Pattern hoàn chỉnh cho mọi trường hợp
# Phần nguyên: optional sign + digits (trước dot hoặc standalone)
# Dùng lookahead hoặc alternation
pattern = r'[+-]?(?:\d+(?=\.)|\d+)'
# Test
for t in ['80.3196', '-12.5', '.75', '42', '+3.14', '-.5']:
m = re.search(pattern, t)
print(f'{t:>8} -> {m.group() if m else "No match"}')
Kết quả
80.3196 -> 80
-12.5 -> 12
.75 -> (no match - không có phần nguyên)
42 -> 42
+3.14 -> 3
-.5 -> (no match)
Lưu ý: Số như .75 hoặc -.5 không có phần nguyên (phần nguyên = 0). Xử lý riêng nếu cần.