Strings dynamisch auswerten

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
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

Hallo zusammen,

Ich erhalte Listen die folgendermassen aussehen
[u'E118.6', u'Vulklep mag/kan open', u'S', u'96.7222S']
[u'A118.7', u'Borging OK', u'H', u'96.7223']
[u'PW120', u'Vermogen', u'Q', u'123.8993']
Jetzt möchte ich die einzelnen Elemente der Liste weiterverarbeiten
z.B.

Liste[0] soll in E und 118.6 oder PW und 120 gesplittet werden
aus Liste[3] will ich die Punkte entfernen usw.

in einem anderen Fall möchte ich in Liste[0] ein Leerzeichen vor der
ersten Ziffer einfügen, also aus E118.6 wird E 118.6
und Liste[2] und Liste[3] sollen zusammengefügt werden.

Das in Python zu programmieren stellt noch kein grosses Problem dar
Aber ich möchte gerne über eine konfigurationsdatei von aussen vorgeben
was mit den einzelnen Elementen geschiehen soll.
Gibt es da eine Bilbliothek für oder wie kann ich das am
einfachsten realisieren.

Ich hoffe mich verständlich ausgedrückt zu haben :-)

gruss
marlob
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich weiß nicht, ob es ein Modul dafür gibt. Das glaube ich aber eher nicht. Am einfachsten erscheint mir, re.sub() zu verwenden und pattern und repl (siehe Doku des re-Moduls) in der Config-Datei zu speichern.
MfG
HWK

Edit: Das geht wohl doch nicht so gut, da Du ja auch verschiedene Elemente verbinden willst.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

marlob hat geschrieben: Ich hoffe mich verständlich ausgedrückt zu haben :-)
Nein, da Du Listen von Listen abbildest, aber in Python Notation das nicht berücksichtigst. Es ist nicht offensichtlich, ob Du von der ersten Sub-Liste sprichst oder von der Liste, die die Sub-Listen verwaltet.

Wieso nicht: "Sei x meine Liste, dann stehen in x[0][y] immer Kombinationen aus Buchstaben und Zahlen. Die will ich..."

HWK hat es aber schon genannt. Ich denke per RegExp kommt man da am besten weiter; Verschachtelungen scheinen ja nicht vorzukommen.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

HWK hat geschrieben:Ich weiß nicht, ob es ein Modul dafür gibt. Das glaube ich aber eher nicht. Am einfachsten erscheint mir, re.sub() zu verwenden und pattern und repl (siehe Doku des re-Moduls) in der Config-Datei zu speichern.
MfG
HWK
Würd ich auch so sagen.
Außerdem muss natürlich zusätzlich zu dem Pattern und Replacement noch der Listenindex gespeichert werden.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

So könnte man evtl. Deine Umwandlungswünsche darstellen:

Code: Alles auswählen

(0, ([A-Z]+)[0-9.]+, \1)
(0, [A-Z]+([0-9.]+), \1)
(3, ([^.]+)\.(.+), \1\2)
(0, ([A-Z]+)([0-9.]+), \1 \2)
(2, .+, \0), (3, .+, \0)
In Klammern Index, Pattern, Replacement. Jede Zeile ergibt ein Element der neuen Liste. Mehrere geklammerte Ausdrücke in einer Zeile werden zu einem Element der neuen Liste zusammengefügt.
MfG
HWK
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

Danke für die Antworten :-)
Werde es mal mit regulären Ausdrücken probieren.


@Hyperion
Stimmt :-) Hätte ich deutlicher beschreiben können.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Natürlich kann man sich eine eigene Programmiersprache ausdenken, um "Liste[0] soll in E und 118.6 oder PW und 120 gesplittet werden" auszudrücken, aber warum nicht Python benutzen?

Code: Alles auswählen

def transform(s):
    if s.startswith("E"): return "E", s[1:]
    if s.startswith("PW"): return "PW", s[2:]
In einer dynamischen Programmiersprache ist es meist das einfachste, Konfigurationen in der selben dynamischen Programmiersprache zu formulieren.

Stefan
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

@sma
Danke für die Antwort.
Dies waren nur Beispiele und die Werte können aus zig verschiedenen
Zahlen und Buchstabenkombinationen bestehen. Da wird der Ansatz von
HWK mit den regulären Ausdrücken wohl eher zum Ziel führen.

Bin aber für jeden Lösungsvorschlag dankbar :)


gruss
marlob
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

marlob hat geschrieben:Da wird der Ansatz von
HWK mit den regulären Ausdrücken wohl eher zum Ziel führen.
Das könnte man ja schon genauso mit Python-Syntax formulieren, dann muss man das Ganze nicht mehr parsen.
Z.B.

Code: Alles auswählen

rules = list()
rules.append( {'index': 1, 'regex': r'\w{2,3}$', 'replacement': 'ABC'} )
Oder so ähnlich halt, wie es dir am geschicktesten ist, sollte jetzt nur ein Beispiel sein ;)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Hier mal der Vorschlag etwas erweitert:

Code: Alles auswählen

import re

rules = (
    ((0, r'([A-Z]+)[0-9.]+', r'\1'),),
    ((0, r'[A-Z]+([0-9.]+)', r'\1'),),
    ((3, r'([^.]+)\.(.+)', r'\1\2'),),
    ((0, r'([A-Z]+)([0-9.]+)', r'\1 \2'),),
    ((2, r'(.+)', r'\1'), (3, r'(.+)', r'\1'))
)

data = (
    (u'E118.6', u'Vulklep mag/kan open', u'S', u'96.7222S'),
    (u'A118.7', u'Borging OK', u'H', u'96.7223'),
    (u'PW120', u'Vermogen', u'Q', u'123.8993')
)

for line in data:
    result = []
    for rule_line in rules:
        item = []
        for rule in rule_line:
            item.append(re.sub(rule[1], rule[2], line[rule[0]]))
        result.append(''.join(item))
    print result
Ausgabe:

Code: Alles auswählen

[u'E', u'118.6', u'967222S', u'E 118.6', u'S96.7222S']
[u'A', u'118.7', u'967223', u'A 118.7', u'H96.7223']
[u'PW', u'120', u'1238993', u'PW 120', u'Q123.8993']
Wenn man die Zeilen 3 bis 9 z.B. in der Datei rules.py speichert, kann man einfach die Regeln mit

Code: Alles auswählen

from rules import rules
importieren.
MfG
HWK
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

Danke HWK,

die Lösung gefällt mir :D
Da kann ich wunderbar drauf aufbauen.

gruss
marlob
Antworten