textersetzung

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
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

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
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

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

Gruß, mawe
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

da wo das ganze klammerngedöns is.. soll später nur der "TEXT" stehen
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Die Klammern löschen, den Rest split()en und das Element [-1] ist der TEXT?
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

ich kann leider nicht eionfach alle klammern löschen.. gibt zuviele eckige klammern die ich noch benötige :/
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Zeig doch bitte mal einen kurzen Ausschnitt aus der Datei, und wie sie nachher aussehen soll, sonst geht mein Herumgerate weiter :wink:
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

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
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
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)
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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

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
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
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
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

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!
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
Antworten