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.

Смотрите так же:
loadtxt, save, savez, savez_compressed


Примеры

Допустим у нас есть следующая таблица:

Список МВФ стран по ВВП (ППС) в миллиардах долларов США
Страна 2016, млрд $ 2017, млрд $ 2017, в %
1Китай213142320818,23
2США187071948515,26
3Индия871594747,45
4Япония525054434,27
5Германия402241993,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')