Модуль 2: Витягування координат із тексту

УРОК 2

Час60-90 хвилин
ПотрібноПройдений Урок 1
РезультатCSV-таблиця з координатами

Задача

У перехопленнях координати записують по-різному:

Ручний пошук — години роботи. Скрипт знайде все за секунди та збереже в таблицю, яку можна відкрити в Excel.

Що освоїмо

Нові терміни

Регулярний вираз (regex)Шаблон для пошуку тексту. Як трафарет: прикладаєш до тексту і бачиш, що підходить під форму.
ПатернТе саме, що шаблон. Часто вживається в контексті regex.
CSVComma 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}")

Запуск

cd C:\osint python extract_coords.py

Очікуваний результат

Знайдено координат: 7 Рядок 1: 48.4567, 35.0234 (decimal) Рядок 2: 48.456667, 35.024444 (DMS) Рядок 4: 49.1234, 36.5678 (decimal) Рядок 5: 48.5, 35.258333 (DMS) Рядок 6: 48.9876, 34.5432 (decimal) Рядок 7: 47.753333, 36.345833 (DMS) Рядок 9: 48.1111, 35.2222 (decimal) Збережено у: coordinates.csv

Файл coordinates.csv відкривається в Excel:

linedatetimelatitudelongitudeformat
12025-01-1508:2348.456735.0234decimal
22025-01-1508:4548.45666735.024444DMS
42025-01-1509:3049.123436.5678decimal
✓ 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: NoneTypesearch нічого не знайшов

Робота з 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

Чек-лист

☐ Файл intercepts.txt створено ☐ Скрипт запускається без помилок ☐ Знайдено 7 координат ☐ coordinates.csv з'явився ☐ CSV коректно відкривається ☐ DMS конвертовані в десяткові

Самостійна практика

Наступний урок

Урок 3: Робота з таблицями

Excel-файли, фільтрація, об'єднання даних з кількох джерел.