Я пытаюсь прочитать и проанализировать словарь данных для публикации данных об использовании микросхем Американского сообщества Бюро переписи населения, как найдено here.regex для синтаксического анализа хорошо сформированного многострочного словаря данных
Он достаточно хорошо сформирован, хотя с небольшим количеством ошибок, когда вставляются несколько пояснительных примечаний.
Я думаю, что мой предпочтительный результат - либо получить блок данных с одной строкой на переменную, и сериализовать все метки значений для данной переменной в один словарь, хранящийся в поле словаря значений в той же строке (хотя иерархический json-подобный формат не будет плохо, но более сложным
Я получил следующий код:..
import pandas as pd
import re
import urllib2
data = urllib2.urlopen('http://www.census.gov/acs/www/Downloads/data_documentation/pums/DataDict/PUMSDataDict13.txt')
## replace newline characters so we can use dots and find everything until a double
## carriage return (replaced to ||) with a lookahead assertion.
data=data.replace('\n','|')
datadict=pd.DataFrame(re.findall("([A-Z]{2,8})\s{2,9}([0-9]{1})\s{2,6}\|\s{2,4}([A-Za-z\-\(\) ]{3,85})",data,re.MULTILINE),columns=['variable','width','description'])
datadict.head(5)
+----+----------+-------+------------------------------------------------+
| | variable | width | description |
+----+----------+-------+------------------------------------------------+
| 0 | RT | 1 | Record Type |
+----+----------+-------+------------------------------------------------+
| 1 | SERIALNO | 7 | Housing unit |
+----+----------+-------+------------------------------------------------+
| 2 | DIVISION | 1 | Division code |
+----+----------+-------+------------------------------------------------+
| 3 | PUMA | 5 | Public use microdata area code (PUMA) based on |
+----+----------+-------+------------------------------------------------+
| 4 | REGION | 1 | Region code |
+----+----------+-------+------------------------------------------------+
| 5 | ST | 2 | State Code |
+----+----------+-------+------------------------------------------------+
до сих пор так хорошо список переменных есть, наряду с шириной в символах каждого
.Я могу exp и это и получить дополнительные линии (где живут метки значений), например, так:
datadict_exp=pd.DataFrame(
re.findall("([A-Z]{2,9})\s{2,9}([0-9]{1})\s{2,6}\|\s{4}([A-Za-z\-\(\)\;\<\> 0-9]{2,85})\|\s{11,15}([a-z0-9]{0,2})[ ]\.([A-Za-z/\-\(\) ]{2,120})",
data,re.MULTILINE))
datadict_exp.head(5)
+----+----------+-------+---------------------------------------------------+---------+--------------+
| id | variable | width | description | value_1 | label_1 |
+----+----------+-------+---------------------------------------------------+---------+--------------+
| 0 | DIVISION | 1 | Division code | 0 | Puerto Rico |
+----+----------+-------+---------------------------------------------------+---------+--------------+
| 1 | REGION | 1 | Region code | 1 | Northeast |
+----+----------+-------+---------------------------------------------------+---------+--------------+
| 2 | ST | 2 | State Code | 1 | Alabama/AL |
+----+----------+-------+---------------------------------------------------+---------+--------------+
| 3 | NP | 2 | Number of person records following this housin... | 0 | Vacant unit |
+----+----------+-------+---------------------------------------------------+---------+--------------+
| 4 | TYPE | 1 | Type of unit | 1 | Housing unit |
+----+----------+-------+---------------------------------------------------+---------+--------------+
Так что получает первое значение и связанную метку. Моя проблема с регулярным выражением здесь, как повторить многострочный матч, начиная с \s{11,15}
и до конца - т. Е. некоторые переменные имеют массу уникальных значений (ST
или state code
, а затем около 50 строк, обозначающих значение и метку для каждого состояния).
Я изменил на раннем этапе возврат каретки в исходном файле с помощью трубы, полагая, что тогда я могу бесстыдно полагаться на точку, чтобы соответствовать всем, пока не вернется двойная каретка, указывающая конец этой конкретной переменной, и вот где Я застрял.
Итак - как повторить многострочный шаблон произвольным числом раз.
(Впоследствии осложнение состоит в том, что некоторые переменные не полностью перечислены в словаре, но показаны с допустимыми диапазонами значений. Например, NP
[число лиц, связанных с одним и тем же домохозяйством], обозначается символом `` 02 ..20` следующее описание. Если я не объяснить это, мой разборе пропустит такие записи, конечно.)
возможный дубликат из [re .search Несколько строк Python] (http://stackoverflow.com/questions/18521319/re-search-multiple-lines-python) –