Netzliste parsen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
driver
User
Beiträge: 20
Registriert: Dienstag 27. März 2007, 12:10

Montag 2. April 2007, 13:21

Hallo Zusammen,
Ich beschäftige mich seit 2 Wochen mit Python.
Im Rahmen einer Studienarbeit, muss ich unter anderem mit Python ein paar lef_def-dateien parsen.

folgendes Problem :
gegeben ist eine Netzliste. Sie sieht in etwa so aus :


- net09081 ( a5773 P1 ) ( a828 P2 ) ;
- net09082 ( a599 P2 ) ( a6782 P3 ) ;
- net09083 ( a6002 P1 ) ( a9917 P3 ) ;
- net09084 ( a6040 P2 ) ( a8915 P2 ) ;
- net09085 ( a6183 P1 ) ( a8294 P1 ) ;


mein Vorschlag :

Code: Alles auswählen

for line in test_file.readlines() :
	if '- net' in line :
		netz = re.findall ( '- net\d+' , line )
		netze.append(netz)
		pin = re.findall( '(\sa\d+ P\d )' , line)
		pins.append(pin)
klappt auch wunderbar

Aber irgendwann tauchten Netze auf, mit großer Anzahl an Pins.
Dabei sind Zeilenumbrüche entstanden.

Z.B

- net00059 ( a10310 P1 ) ( a11576 P0 ) ( a11590 P0 ) ( a12177 P0 ) ( a1767 P0 )
( a3523 P0 ) ( a4125 P0 ) ( a497 P0 ) ( a6016 P0 ) ( a6762 P0 ) ( a7151 P0 )
( a8318 P0 ) ( a8599 P1 ) ( a9020 P0 ) ;


Meine Frage ist nun : Wie kann ich diese Zeilenumbrüche in meinem Programm berücksichtigen, so dass ich wie vorhin 2 gleichgroße Listen erhalte : netze und pins

Danke im Voraus
MfG driver
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Montag 2. April 2007, 13:30

hi!

wie waers mit sowas aenliches wie:

Code: Alles auswählen

for i in (';' + pins.replace('\n', '')).split(';- net'):
    ...

edit:
waere es nicht vorteilhafter ales in nen dict zu packen?
cp != mv
BlackJack

Montag 2. April 2007, 15:57

Folgendes zieht aus einer Zeichenkette die den gesamten Quelltext enthält die Netzlisten und daraus dann jeweils die variablen Teile der Pins und speichert die Informationen in einem Dictionary.

Code: Alles auswählen

import re
from pprint import pprint

data = """
- net09081 ( a5773 P1 ) ( a828 P2 ) ;
- net09082 ( a599 P2 ) ( a6782 P3 ) ;
- net09083 ( a6002 P1 ) ( a9917 P3 ) ;
- net09084 ( a6040 P2 ) ( a8915 P2 ) ;
- net09085 ( a6183 P1 ) ( a8294 P1 ) ;
- net00059 ( a10310 P1 ) ( a11576 P0 ) ( a11590 P0 ) ( a12177 P0 ) ( a1767 P0 )
( a3523 P0 ) ( a4125 P0 ) ( a497 P0 ) ( a6016 P0 ) ( a6762 P0 ) ( a7151 P0 )
( a8318 P0 ) ( a8599 P1 ) ( a9020 P0 ) ;
"""

def main():
    nets = dict()
    for net_match in re.finditer(r'^- net(\d+)[^;]+;',
                                 data,
                                 re.DOTALL | re.MULTILINE):
        pins = re.findall(r'\( a(\d+) P(\d+) \)', net_match.group(0))
        nets[net_match.group(1)] = pins
    pprint(nets)
driver
User
Beiträge: 20
Registriert: Dienstag 27. März 2007, 12:10

Donnerstag 5. April 2007, 19:56

Danke BlackJack :D
Das hat mir weiter geholfen

mfg
driver
BlackJack

Donnerstag 5. April 2007, 21:45

Ich habe gerade gesehen das ich in dem ersten regulären Ausdruck gar keinen Punkt mehr habe, also ist das ``re.DOTALL`` überflüssig. :-)
Antworten