numpy.fromregex
numpy.fromregex(file, regexp, dtype, encoding=None)
Функция fromregex() создает массив из данных текстового файла с использованием регулярных выражений.
Данная функция всегда создает структурированный массив, элементами которого являются все совпадения регулярного выражения и текста в файле. Группы в регулярном выражении соответствуют полям (столбцам) возвращаемого массива.
-
- file - строка, файловый объект
- Файл из которого должен быть загружен массив.
- mmap_mode - строка с регулярным выражением.
- Строка, содержащая регулярное выражение. Количество групп в регулярном выражении соответствует количеству полей в возвращаемом массиве.
- dtype - тип данных NumPy или список с перечислением типов данных
- Тип данных структурированного массива. Если указанный тип данных является недопустимым для возвращаемого массива, то вызывается исключение TypeError.
- encoding - строка (необязательный параметр).
- Определяет кодировку, используемую при чтении файлов. По умолчанию None, что соответствует системным установкам по умолчанию. Доступно в NumPy с версии 1.14.0.
-
- результат - массив NumPy
- Структурированный массив, элементами которого являются части текста, удовлетворяющие регулярному выражению.
Замечание
Данная функция может оказаться крайне полезна, если вам очень часто приходится иметь дело с хорошо структурированными размеченными текстовыми данными, например, xml, html или pdf.
Примеры
Допустим у нас есть следующая таблица:
№ | Страна | 2016, млрд $ | 2017, млрд $ | 2017, в % |
---|---|---|---|---|
1 | Китай | 21314 | 23208 | 18,23 |
2 | США | 18707 | 19485 | 15,26 |
3 | Индия | 8715 | 9474 | 7,45 |
4 | Япония | 5250 | 5443 | 4,27 |
5 | Германия | 4022 | 4199 | 3,28 |
А вот исходный html-код этой страницы, который хранится в файле fromregex_exaple_1.txt в папке example:
<table class="table" style="font-size: 14px; word-break: break-all;"> <caption>Список МВФ стран по ВВП (ППС) в миллиардах долларов США</caption> <thead> <tr> <th>№</th> <th>Страна</th> <th>2016, млрд $</th> <th>2017, млрд $</th> <th>2017, в %</th> </tr> </thead> <tbody> <tr><td>1</td><td>Китай</td><td>21314</td><td>23208</td><td>18,23</td></tr> <tr><td>2</td><td>США</td><td>18707</td><td>19485</td><td>15,26</td></tr> <tr><td>3</td><td>Индия</td><td>8715</td><td>9474</td><td>7,45</td></tr> <tr><td>4</td><td>Япония</td><td>5250</td><td>5443</td><td>4,27</td></tr> <tr><td>5</td><td>Германия</td><td>4022</td><td>4199</td><td>3,28</td></tr> </tbody> </table>
Как видим в этой таблице у нас всего пять полей (нас интерисует только контейнер tbody
), значит регулярное выражение должно содержать 5 групп:
>>> import numpy as np
>>>
>>> reg_exp = r"((?<=>)\d(?=</))</td><td>+((?<=>)\D{1,}(?=</))</td><td>+((?<=>)\d+(?=</))</td><td>+((?<=>)\d+(?=</))</td><td>+((?<=>)\d+,\d+(?=</))"
>>>
>>> data_type = [('№', np.int16), ('Страна', 'U10'), ('2016', np.int32), ('2017', np.int16), ('%', 'U4')]
>>>
>>> out = np.fromregex('example/fromregex_exaple_1.txt', reg_exp, data_type)
>>>
>>> out
array([(1, 'Китай', 21314, 23208, '18,2'),
(2, 'США', 18707, 19485, '15,2'),
(3, 'Индия', 8715, 9474, '7,45'),
(4, 'Япония', 5250, 5443, '4,27'),
(5, 'Германия', 4022, 4199, '3,28')],
dtype=[('№', '<i2'), ('Страна', '<U10'), ('2016', '<i4'), ('2017', '<i2'), ('%', '<U4')])
Обратите внимание на последнее поле с процентами, в нем в качестве разделителя используется запятая, а не точка, именно поэтому, мы вынуждены использовать для него строковый а не числовой тип данных:
>>> out['%']
array(['18,2', '15,2', '7,45', '4,27', '3,28'], dtype='<U4')