On Tue, May 12, 2009 at 3:59 AM, spir <denis.s...@free.fr> wrote: > Le Mon, 11 May 2009 19:09:30 -0700 (PDT), > nickel flipper <nickelflip...@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 _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor