Seite 1 von 1

Strings dynamisch auswerten

Verfasst: Freitag 20. November 2009, 15:28
von marlob
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

Verfasst: Freitag 20. November 2009, 15:44
von HWK
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.

Re: Strings dynamisch auswerten

Verfasst: Freitag 20. November 2009, 16:00
von Hyperion
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.

Verfasst: Freitag 20. November 2009, 16:03
von ms4py
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.

Verfasst: Freitag 20. November 2009, 16:24
von HWK
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

Verfasst: Freitag 20. November 2009, 18:46
von marlob
Danke für die Antworten :-)
Werde es mal mit regulären Ausdrücken probieren.


@Hyperion
Stimmt :-) Hätte ich deutlicher beschreiben können.

Verfasst: Samstag 21. November 2009, 10:59
von sma
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

Verfasst: Samstag 21. November 2009, 11:52
von marlob
@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

Verfasst: Samstag 21. November 2009, 12:24
von ms4py
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 ;)

Verfasst: Samstag 21. November 2009, 12:55
von HWK
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

Verfasst: Samstag 21. November 2009, 18:44
von marlob
Danke HWK,

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

gruss
marlob