Парсинг нестандартного текста
В таблице 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'])