[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