Извлечь единицы объема из строки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * Извлечь единицы объема жидкости из строки. * С использованием регулярных выражений (regexps) в python. * Пример данных. DATA LIST LIST /drink_vol (A33). BEGIN DATA '50 ml' 'Large Wine Glass (250 ml' '500ml', 'Standard Wine Glass (175 ml', 'ml', 'Standard Wine Glass (175 ml', '1 Litre', '187ml mini wine bottle', 'Pint', '1.5 Litre' 'Half Pint' 'Half-pint' END DATA. * Извлекаем миллилитры. BEGIN PROGRAM Python. |
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import spssdata, re # Следующие 3 строчки кода - необходимые издержки для того, чтобы выгрузить данные в python # и создать в словаре SPSS новую переменную, которая будет содержать результат разбора data = spssdata.Spssdata(indexes=('drink_vol'), accessType='w') data.append(spssdata.vdef('vol', vlabel='Volume, ml',vfmt=['F', 8, 0])) data.commitdict() for i,row in enumerate(data): ml = None # Создадим список образцов поиска и соответствующие им множители для преобразования # извлеченных единиц к миллилитрам (ml) patterns = [ (r'(?P<number>\d+\.*\d*) *ml', 1), # т.е одна или более цифр, опционально с десятичной точкой и 'ml' в конце (возможно, через пробел) (r'(?P<number>\d+\.*\d*) *litre', 1000), # то же самое с литрами (умножаем 1000), # Можете добавить сюда свои паттерны для поиска... ] for pattern in patterns: volume = re.search(pattern[0], row.drink_vol.lower()) if volume: ml = float(volume.group('number')) * pattern[1] break # разбор единиц, которые не представлены числами (пинта и полупинта) if not ml: if "pint" in row.drink_vol.lower(): if "half" in row.drink_vol.lower(): ml = 568.26 / 2 else: ml = 568.26 data.casevalues([ml]) data.CClose() |
54 | END PROGRAM.
|
Related pages
...