Seite 1 von 1

textersetzung

Verfasst: Montag 4. April 2005, 11:16
von powerslide
Hi,

ich hab mal wieder ein problem mit textersetzung..

und zwar muss ich in xml-files folgende zeichenfolgen ersetzen

ach ja.. ich benötige immer den TEXT

[[ TEXT ]] -> gut dass ist einfach und bekomm ich auch hin

[[[ TYP ] TEXT ]] -> hier sieht das ganze schon nicht mehr so toll aus..

[[[ TYP ] LINK [ TEXT ]]] -> vom ansatz wahrscheinlich genauso zu lösen wie 2 .. trotzdem doof!

kann mir da jemand helfen?

wär super

slide

Verfasst: Montag 4. April 2005, 11:20
von mawe
Hi!

Nur fürs Verständnis: Du willst TEXT ersetzten, oder willst Du TEXT einfach nur herausfilern?

Gruß, mawe

Verfasst: Montag 4. April 2005, 11:29
von powerslide
da wo das ganze klammerngedöns is.. soll später nur der "TEXT" stehen

Verfasst: Montag 4. April 2005, 11:31
von mawe
Die Klammern löschen, den Rest split()en und das Element [-1] ist der TEXT?

Verfasst: Montag 4. April 2005, 12:22
von powerslide
ich kann leider nicht eionfach alle klammern löschen.. gibt zuviele eckige klammern die ich noch benötige :/

Verfasst: Montag 4. April 2005, 12:24
von mawe
Zeig doch bitte mal einen kurzen Ausschnitt aus der Datei, und wie sie nachher aussehen soll, sonst geht mein Herumgerate weiter :wink:

Verfasst: Montag 4. April 2005, 12:45
von powerslide
ok

in der xml-datei kommen folgende konstrukte vor

[[KM 1: KM-Planung]]

[[[resource]Produktentstehung]]

[[[artifact] INDEX [Produkte]]]

eben nach folgendem schema

[[ TEXT ]]
[[[ TYP ] TEXT ]]
[[[ TYP ] LINK [ TEXT ]]]

nachher soll dies anstatt der konstrukte in der file stehen bleiben

KM 1: KM-Planung
Produktentstehung
Produkte

die xml-files sind exportierte dateien.. und da mein tool wo ich diese files einbinden muss manches nicht versteht.. (und wir manches auch gar nicht benötigen).. muss ich das halt umbasteln dass die unwichtige information.. angabe von typ und link rausfällt.. genauso wie eben die eckigen klammern.. aber halt auch nur da wo dieses konstrukt zutrifft.. alle eckigen klammern dürfen nicht gelöscht werden

slide

Verfasst: Montag 4. April 2005, 13:53
von Gast
Hi zusammen,
wenn ich das richtig kapiert hab ;)
Da ich nicht viel Ahnung von Regulären ausdrücken habe,
hier mal mein gefrickel :D

Code: Alles auswählen

unit1 = "[[KM 1: KM-Planung]]"
unit2 = "[[[resource]Produktentstehung]]"
unit3 = "[[[artifact] INDEX [Produkte]]]"

import re

print "---"

print unit1
unit1_c  = re.compile("\[\[(.+?)\]\]", re.I|re.S)
unit1  = unit1_c.sub("Der Text: \\1", unit1) 
print unit1

print "----"

print unit2
unit2_c  = re.compile("\[\[\[(.+?)\](.+?)\]\]", re.I|re.S)
unit2  = unit2_c.sub("\\1 , \\2", unit2) # \\1 = Type, \\2 = Text
print unit2
Ich hab keine Ahnung wie sich das mit XML besonders mit CDATA Bereichen verträgt. Musst Du ausprobieren.


MfG
Andreas (XT@ngel)

Verfasst: Montag 4. April 2005, 14:09
von joe
Soweit ich die aufgabe verstanden habe, wäre das vielleicht ein weg:

Code: Alles auswählen

import re

text = """<<KM 1: KM-Planung>>
<<<resource>Produktentstehung>>
<<<artifact> INDEX <Produkte>>> """

text = re.sub("<<<[^>]*>[^<]*<([^>]*)>>>(?m)",r"\1",text)
text = re.sub("<<<[^>]*>([^>]*)>>(?m)",r"\1",text)
text = re.sub("<<([^>]*)>>(?m)",r"\1",text)
print text
Ich hab mal ersatzweise spitze klammern genommen, weil man sonst vor lauter backslashes ganz wuschig wird. joe

Verfasst: Montag 4. April 2005, 15:37
von mawe
Hi!

Code: Alles auswählen

import re

text = '''
hallo [lalu] [[ TEXT ]] lala
zizi [[[ TYP ] TEXT ]] gaga 
baba [[[ TYP ] LINK [ TEXT ]]] l [u] lu
'''

for line in text.split("\n"):
    line = re.sub("\[\[\[?.*?([^\[\]]*)\]\]\]?", r"\1", line)
    print line
Ahhh, meine Augen!!! :D

Gruß, mawe

Verfasst: Dienstag 5. April 2005, 09:14
von powerslide
super genial..

besten dank jungs.. das hat mir echt geholfen..
der erste testlauf sagt.. es funzt 1A ... werd jetzt noch ein wenig testen..

@ mawe .. könntest du mir deine regex evtl ein wenig erklären?
prinzipiell komm ich zwar damit zurecht :? aber das wars auch schon :cry:

slide

Verfasst: Dienstag 5. April 2005, 11:45
von mawe
Hi!

Code: Alles auswählen

#-*- coding: utf-8 -*-

import re

text = '''
hallo [lalu] [[ TEXT ]] [[[ TYP ] TEXT ]] lala
zizi [[[ TYP ] TEXT ]] gaga 
baba [[[ TYP ] LINK [ TEXT ]]] l [u] lu
'''

pattern = re.compile(r"""
        \[\[        # 2 öffnende eckige Klammern 
        \[?         # vielleicht noch eine? (das ? bedeutet: 0 oder 1 mal)
        .*?         # irgendein Zeichen, 0 oder mehrmals (*), nicht gierig (?)
        (           # alles was in den () steht, interessiert uns, darauf 
                    # können wir später mit \1 zugreifen
        [^\[\]]*    # [] definiert eine Zeichenmenge , also [ab] passt auf a und auf b
                    # das ^ in den [] negiert das, hier also: passt, wenn das Zeichen 
                    # kein [ oder ] ist
                    # das ganze 0 oder mehrmals -> also der TEXT
        )           # das war alles was uns interessiert
        \]\]        # zum Schluss kommen noch mal 2 schliessende ]
        \]?         # und eventuell noch eine
        """, re.VERBOSE) 

for line in text.split("\n"):
    line = re.sub(pattern, r"\1", line)
    print line
Hoffe das hilft ein wenig :wink:

Gruß, mawe

Verfasst: Dienstag 5. April 2005, 13:29
von joe
Hi!
mawe hat geschrieben:

Code: Alles auswählen

        \[?         # vielleicht noch eine? (das ? bedeutet: 0 oder 1 mal)
        \]?         # und eventuell noch eine
Wobei die beiden bedingungen aber probleme machen können, da sie unabhängig voneinander sind. Der re erkennt z.B. auch [[ TYP ] LINK [ TEXT ]]] oder auch [[[ TYP ] LINK [ TEXT1 ]] TEXT2] als gültig. Da stößt man mit regexps schnell an grenzen. Man braucht wohl mehrere regexps um die varianten eindeutig abzuprüfen. joe

Verfasst: Dienstag 5. April 2005, 15:23
von powerslide
nein das ist kein problem..
die xml-dateien werden automatisch generiert..

und es kommen nur die 3 erwähnten konstrukte vor.. alle haben die gleiche form .. keine abwandlungen!

ich hab heute 3 testläufe gemacht.. und die regex hat ganz hervorragend funktioniert!