[Tutor] How to set up an Array?
Kent Johnson
kent37 at tds.net
Tue May 12 13:16:56 CEST 2009
On Tue, May 12, 2009 at 3:59 AM, spir <denis.spir at free.fr> wrote:
> Le Mon, 11 May 2009 19:09:30 -0700 (PDT),
> nickel flipper <nickelflipper at yahoo.com> s'exprima ainsi:
>> So from the data set below, will be looking to print out:
>> RA7,OSC1,CLKI
>> RA6,OSC2
>> RA5,AN4,nSS1,LVDIN,RCV,RP2
>> ETC.
>>
>> Any tips greatly appreciated. Thanks.
>>
>>
>> sfr (key=PORTA addr=0xf80 size=1 access='rw rw rw u rw rw rw rw')
>> reset (por='xxxxxxxx' mclr='uuuuuuuu')
>> bit (names='RA7 RA6 RA5 - RA3 RA2 RA1 RA0' width='1 1 1 1 1 1 1 1')
>> bit (tag=scl names='RA' width='8')
>> bit (names='OSC1 OSC2 AN4 - AN3 AN2 AN1 AN0' width='1 1 1 1 1 1 1 1')
>> bit (names='CLKI CLKO nSS1 - VREF_PLUS VREF_MINUS C2INA C1INA' width='1
>> 1 1 1 1 1 1 1') bit (names='- - LVDIN - C1INB CVREF_MINUS PMPA7 PMPA6'
>> width='1 1 1 1 1 1 1 1') bit (names='- - RCV - - C2INB RP1 RP0' width='1 1
>> 1 1 1 1 1 1') bit (names='- - RP2 - - - - -' width='1 1 1 1 1 1 1 1')
> Hem, rather complicated. I would use a regex for once in this precise case. But forget it if you're not used to regexes, rather take the opportunity to learn python builtin strings methods better.
> from re import compile as Pattern
> p = Pattern(r"names='((?:(?:\w+|-) ?){8})'")
That is quite a bit more complicated than needed. You want to match a
string that starts with "bit (names='" and ends with the next '. You
can do that like this:
In [18]: s = """\
....: sfr (key=PORTA addr=0xf80 size=1 access='rw rw rw u rw rw rw rw')
....: reset (por='xxxxxxxx' mclr='uuuuuuuu')
....: bit (names='RA7 RA6 RA5 - RA3 RA2 RA1 RA0' width='1 1 1 1 1 1 1 1')
....: bit (tag=scl names='RA' width='8')
....: bit (names='OSC1 OSC2 AN4 - AN3 AN2 AN1 AN0' width='1 1 1
1 1 1 1 1')
....: bit (names='CLKI CLKO nSS1 - VREF_PLUS VREF_MINUS C2INA
C1INA' width='1 1 1 1 1 1 1 1')
....: bit (names='- - LVDIN - C1INB CVREF_MINUS PMPA7 PMPA6'
width='1 1 1 1 1 1 1 1')
....: bit (names='- - RCV - - C2INB RP1 RP0' width='1 1 1 1 1 1 1 1')
....: bit (names='- - RP2 - - - - -' width='1 1 1 1 1 1 1 1')"""
In [19]: import re
In [23]: p = re.compile(r"bit \(names='([^']+)'")
In [24]: r = p.findall(s)
In [25]: r
Out[25]:
['RA7 RA6 RA5 - RA3 RA2 RA1 RA0',
'OSC1 OSC2 AN4 - AN3 AN2 AN1 AN0',
'CLKI CLKO nSS1 - VREF_PLUS VREF_MINUS C2INA C1INA',
'- - LVDIN - C1INB CVREF_MINUS PMPA7 PMPA6',
'- - RCV - - C2INB RP1 RP0',
'- - RP2 - - - - -']
Now split the matches into individual words:
In [26]: r = [ i.split() for i in r ]
In [27]: r
Out[27]:
[['RA7', 'RA6', 'RA5', '-', 'RA3', 'RA2', 'RA1', 'RA0'],
['OSC1', 'OSC2', 'AN4', '-', 'AN3', 'AN2', 'AN1', 'AN0'],
['CLKI', 'CLKO', 'nSS1', '-', 'VREF_PLUS', 'VREF_MINUS', 'C2INA', 'C1INA'],
['-', '-', 'LVDIN', '-', 'C1INB', 'CVREF_MINUS', 'PMPA7', 'PMPA6'],
['-', '-', 'RCV', '-', '-', 'C2INB', 'RP1', 'RP0'],
['-', '-', 'RP2', '-', '-', '-', '-', '-']]
Transpose the list of lists:
In [28]: r = zip(*r)
In [29]: r
Out[29]:
[('RA7', 'OSC1', 'CLKI', '-', '-', '-'),
('RA6', 'OSC2', 'CLKO', '-', '-', '-'),
('RA5', 'AN4', 'nSS1', 'LVDIN', 'RCV', 'RP2'),
('-', '-', '-', '-', '-', '-'),
('RA3', 'AN3', 'VREF_PLUS', 'C1INB', '-', '-'),
('RA2', 'AN2', 'VREF_MINUS', 'CVREF_MINUS', 'C2INB', '-'),
('RA1', 'AN1', 'C2INA', 'PMPA7', 'RP1', '-'),
('RA0', 'AN0', 'C1INA', 'PMPA6', 'RP0', '-')]
Filter out the '-' entries
In [30]: r = [ [ t for t in i if t!='-' ] for i in r ]
In [31]: r
Out[31]:
[['RA7', 'OSC1', 'CLKI'],
['RA6', 'OSC2', 'CLKO'],
['RA5', 'AN4', 'nSS1', 'LVDIN', 'RCV', 'RP2'],
[],
['RA3', 'AN3', 'VREF_PLUS', 'C1INB'],
['RA2', 'AN2', 'VREF_MINUS', 'CVREF_MINUS', 'C2INB'],
['RA1', 'AN1', 'C2INA', 'PMPA7', 'RP1'],
['RA0', 'AN0', 'C1INA', 'PMPA6', 'RP0']]
And print:
In [32]: for i in r:
....: print ','.join(i)
RA7,OSC1,CLKI
RA6,OSC2,CLKO
RA5,AN4,nSS1,LVDIN,RCV,RP2
RA3,AN3,VREF_PLUS,C1INB
RA2,AN2,VREF_MINUS,CVREF_MINUS,C2INB
RA1,AN1,C2INA,PMPA7,RP1
RA0,AN0,C1INA,PMPA6,RP0
Other than the blank line, this is what was wanted. You can even make
it a one-liner if you want to make it really obscure ;-)
In [39]: rr = [ ','.join(t for t in i if t!='-') for i in zip(*(
i.split() for i in p.findall(s) )) ]
In [40]: rr
Out[40]:
['RA7,OSC1,CLKI',
'RA6,OSC2,CLKO',
'RA5,AN4,nSS1,LVDIN,RCV,RP2',
'',
'RA3,AN3,VREF_PLUS,C1INB',
'RA2,AN2,VREF_MINUS,CVREF_MINUS,C2INB',
'RA1,AN1,C2INA,PMPA7,RP1',
'RA0,AN0,C1INA,PMPA6,RP0']
Kent
More information about the Tutor
mailing list