Ручний пошук — години роботи. Скрипт знайде все за секунди та збереже в таблицю, яку можна відкрити в Excel.
Що освоїмо
Регулярні вирази — інструмент для пошуку за шаблоном
CSV-формат — універсальний табличний формат
Конвертація форматів — перетворення градусів-хвилин-секунд у десяткові
Нові терміни
Регулярний вираз (regex)
Шаблон для пошуку тексту. Як трафарет: прикладаєш до тексту і бачиш, що підходить під форму.
Патерн
Те саме, що шаблон. Часто вживається в контексті regex.
CSV
Comma Separated Values — текстовий файл, де коми розділяють колонки. Відкривається в Excel.
Бібліотека
Набір готового коду. Як набір інструментів: замість винаходити молоток — берем готовий.
Імпорт
Команда, яка підключає бібліотеку. import re — підключаємо інструменти для regex.
Регулярні вирази: мінімум для розуміння
Regex — це мова опису шаблонів. Уяви, що треба знайти всі номери телефонів у документі. Ти не знаєш конкретні номери, але знаєш формат: +380, потім 9 цифр. Regex дозволяє сказати: "шукай щось, що виглядає як номер телефону".
Символ
Значення
Приклад
\d
Будь-яка цифра (0-9)
\d → 5
\d+
Одна+ цифр підряд
\d+ → 48, 123
\d{2}
Рівно дві цифри
\d{2} → 48
\.
Крапка (саме крапка)
48\.5 → 48.5
\s
Пробіл
a\sb → a b
[NS]
N або S
[NS] → N
()
Група для витягування
(\d+) запам'ятає
|
АБО
кіт|пес → кіт
?
Може бути або ні
colou?r → color
Приклад: шаблон для координат
(\d+\.\d+)[,\s]\s*(\d+\.\d+)
Розбір:
(\d+\.\d+)
Група: цифри, крапка, цифри — широта
[,\s]
Кома АБО пробіл
\s*
Можливі додаткові пробіли
(\d+\.\d+)
Друга група — довгота
💡 Не треба запам'ятовувати синтаксис. Достатньо розуміти принцип. AI напише конкретний шаблон під твої дані.
Вхідні дані
Створи файл intercepts.txt у папці C:\osint:
[2025-01-15 08:23] Група на позиції 48.4567, 35.0234
[2025-01-15 08:45] Переміщення до точки 48°27'24"N 35°01'26"E
[2025-01-15 09:12] Звичайний текст без координат
[2025-01-15 09:30] Підтверджено 49.1234 36.5678
[2025-01-15 10:15] Виїзд з 48°30'00"N, 35°15'30"E
[2025-01-15 10:45] Координати цілі: 48.9876, 34.5432
[2025-01-15 11:00] Спостереження з точки 47°45'12"N 36°20'45"E
[2025-01-15 11:30] Нічого важливого
[2025-01-15 12:00] Позиція 2: 48.1111, 35.2222
Скрипт
Створи файл extract_coords.py:
# Скрипт для витягування GPS-координат
# Знаходить десяткові та градуси-хвилини-секунди
# Результат зберігає в CSV
# -------- ПІДКЛЮЧЕННЯ БІБЛІОТЕК --------
import re # Для регулярних виразів
import csv # Для роботи з таблицями
# -------- НАЛАШТУВАННЯ --------
input_file = "intercepts.txt"
output_file = "coordinates.csv"
# -------- ШАБЛОНИ --------
# Десяткові: 48.4567, 35.0234
pattern_decimal = r'(\d+\.\d+)[,\s]\s*(\d+\.\d+)'
# Градуси-хвилини-секунди: 48°27'24"N 35°01'26"E
pattern_dms = r"(\d+)°(\d+)'(\d+)"([NS])[,\s]\s*(\d+)°(\d+)'(\d+)"([EW])"
# -------- ФУНКЦІЯ КОНВЕРТАЦІЇ --------
def dms_to_decimal(degrees, minutes, seconds, direction):
"""
Перетворює градуси-хвилини-секунди в десятковий формат.
Формула: градуси + хвилини/60 + секунди/3600
"""
decimal = float(degrees) + float(minutes)/60 + float(seconds)/3600
# S (південь) або W (захід) — від'ємні
if direction in ['S', 'W']:
decimal = -decimal
return round(decimal, 6)
# -------- ОСНОВНИЙ КОД --------
results = []
with open(input_file, 'r', encoding='utf-8') as file:
for line_number, line in enumerate(file, 1):
# Витягуємо дату та час
time_match = re.search(r'\[(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2})\]', line)
date = time_match.group(1) if time_match else ""
time = time_match.group(2) if time_match else ""
# Шукаємо десяткові координати
for match in re.findall(pattern_decimal, line):
lat, lon = match
results.append({
'line': line_number,
'date': date,
'time': time,
'latitude': lat,
'longitude': lon,
'format': 'decimal',
'source': line.strip()
})
# Шукаємо DMS-координати
for match in re.findall(pattern_dms, line):
lat_deg, lat_min, lat_sec, lat_dir, lon_deg, lon_min, lon_sec, lon_dir = match
lat_decimal = dms_to_decimal(lat_deg, lat_min, lat_sec, lat_dir)
lon_decimal = dms_to_decimal(lon_deg, lon_min, lon_sec, lon_dir)
results.append({
'line': line_number,
'date': date,
'time': time,
'latitude': str(lat_decimal),
'longitude': str(lon_decimal),
'format': 'DMS',
'source': line.strip()
})
# -------- ЗБЕРЕЖЕННЯ В CSV --------
with open(output_file, 'w', encoding='utf-8', newline='') as csvfile:
fieldnames = ['line', 'date', 'time', 'latitude', 'longitude', 'format', 'source']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(results)
# -------- РЕЗУЛЬТАТ --------
print(f"Знайдено координат: {len(results)}")
print()
for r in results:
print(f" Рядок {r['line']}: {r['latitude']}, {r['longitude']} ({r['format']})")
print()
print(f"Збережено у: {output_file}")
✓ DMS-координати автоматично конвертовані в десяткові. 48°27'24"N став 48.456667. Усі координати в єдиному форматі.
Ключові концепції
Буква r перед шаблоном
pattern = r'(\d+\.\d+)'
r означає "raw string". Без неї \ інтерпретується як спеціальний символ. Завжди використовуй r для regex.
re.findall vs re.search
re.findall(pattern, text) # Усі збіги
re.search(pattern, text) # Перший збіг
Групи та .group()
match = re.search(r'(\d+)-(\d+)', '2025-01')
match.group(1) # '2025'
match.group(2) # '01'
Дужки () створюють групи. group(1) — перша, group(2) — друга.
newline='' для CSV
open(file, 'w', newline='')
На Windows без цього між рядками з'являться порожні рядки.
Якщо не працює
Помилка
Рішення
re.error: bad escape
Забув r перед шаблоном
Координати не знаходяться
Формат у даних інший — адаптуй шаблон
CSV криво в Excel
Відкривай: Дані → З тексту/CSV → UTF-8
Порожні рядки в CSV
Додай newline=''
AttributeError: NoneType
search нічого не знайшов
Робота з AI
Промпт для цієї задачі
Напиши Python-скрипт для витягування GPS-координат.
Вхід: intercepts.txt (UTF-8)
Формати:
1. Десяткові: 48.4567, 35.0234
2. DMS: 48°27'24"N 35°01'26"E
Також витягни дату/час: [2025-01-15 08:23]
Вихід: CSV з колонками — рядок, дата, час, широта, довгота, формат, текст.
Тільки стандартні бібліотеки. Коментарі українською.
Адаптація під свої дані
У моїх даних координати так:
Lat: 48.4567 Lon: 35.0234
або N48.4567 E35.0234
Адаптуй regex для цих форматів.
Типові помилки AI
Занадто складні regex
Забуває newline=''
Плутає широту з довготою
Не враховує від'ємні координати
Чек-лист
☐
Файл intercepts.txt створено
☐
Скрипт запускається без помилок
☐
Знайдено 7 координат
☐
coordinates.csv з'явився
☐
CSV коректно відкривається
☐
DMS конвертовані в десяткові
Самостійна практика
Новий формат. Додай підтримку координат без пробілу: 48.4567,35.0234
Фільтрація. Виводь тільки координати з широтою 48-49°
Реальні дані. Спробуй на справжніх перехопленнях
Наступний урок
Урок 3: Робота з таблицями
Excel-файли, фільтрація, об'єднання даних з кількох джерел.