Парсинг нестандартного текста

В таблице mySQL есть большое количество названий месторождений Нужно написать программу которая будет разбирать данные названия на [название месторождения][номер куста][номер скважины], если номер куста отсутствует, например: "Солнечный ЛУ, 307", то номер куста остаётся пустым

Пример входных данных:

Ватьеганское к. 21, 525 вывод: [Ватьеганское][21][525]

Им. Черномырдина 21, 58 вывод: [Им. Черномырдина] [21] [58]

Казанская, 2 вывод: [Казанская] [] [2]

Уренгойское U12, U1207 вывод: [Уренгойское][U12][U1207]

На данный момент решение выполнено с помощью регулярных выражений, но подходит только для шаблона "Месторождение к. 1, 1"

Я писала на python, но можете подсказывать на любом ЯП

Код:

            field = re.search(r"^.*?(?=,|к\.)", results['f20020'])
            cluster = re.search(r"\w*?\d.*?(?=\,)", results['f20020'])
            well = re.search(r"(?!.*?,)(?!.*?,)(\S.*)", results['f20020'])
            if field == None or cluster == None or well == None:
                continue
            WELLS[results['f20060']].update(
                {results['id']:
                    {
                        'field' : field.group(0).strip(),
                        'cluster' : cluster.group(0),
                        'well' : well.group(0),
                        'well_name' :results['f20020'],
                        'subsoil_user' :results['f435']
                    }
                })

Ответы (1 шт):

Автор решения: Сергей Кох

Можно так:

import re

strs = ['Солнечный ЛУ, 307', 'Ватьеганское к. 21, 525', 'Им. Черномырдина 21, 58',
        'Казанская, U2', 'Уренгойское U12, U1207']


for s in strs:
    # если номера начинаются с U, то сначала ее убираем, а затем восстанавливаем.
    u = ''
    if s.find('U') != -1:
        u = 'U'
        s = s.replace('U', '')

    # разбиваем строку на не цифровые элементы, берем первый и удаляем с конца строки все ненужное

    name = re.findall(r'\D+', s)[0].rstrip(' ,')
    name = name.replace(' к.', '')

    # разбиваем строку на цифровые элементы, если один, то добавляем [] и собираем полученное

    nums = re.findall(r'\d+', s)
    if len(nums) == 1:
        ss = [name], [], [f'{u}{x}' for x in nums]
    else:
        ss = [name], *[[f'{u}{x}'] for x in nums]
    print(ss)
(['Солнечный ЛУ'], [], ['307'])
(['Ватьеганское'], ['21'], ['525'])
(['Им. Черномырдина'], ['21'], ['58'])
(['Казанская'], [], ['U2'])
(['Уренгойское'], ['U12'], ['U1207'])
→ Ссылка