Seite 1 von 1
Regex --> Upper Lower case
Verfasst: Mittwoch 2. Februar 2005, 18:25
von Gast
Hallo
ich habe folgendes problem was ich weder über Suchfunktion noch Manuals in angemessener Zeit lösen konnte.
Mein String hat zB folgende Gestalt:
st = 'ABC_defgh_IjklmnR28'
Bitte beachtet die groß und Klein - Schreibung.
diesen string würde ich gerne umformatieren zu folgender Gestalt:
erg = Ijklmn_R28_defgh
Nun ....wie kann ich das R28 rausholen??
Das Dumme ist strings wie : 'ABC_defgh_Ijklmn33'
sollen nicht nach dem schema umformatiert werden: --> Ijklmn33_defgh
ich denke die einzige Möglihckeit ist irgendwie mit regular expressions nach Uppercase zu suchen..
Ginge es so zu suchen:
°Von hinten anfangen
°Wenn Zahlen dann solange nach links bis Buchstabe
° Ist Buchstabe Großbuchstabe dann nach Schema trennen
wäre das mit regex = '[A_Z]' so möglich?
Danke euch für eure Hilfe!!!
Re: Regex --> Upper Lower case
Verfasst: Mittwoch 2. Februar 2005, 18:44
von Leonidas
Anonymous hat geschrieben:Ginge es so zu suchen:
°Von hinten anfangen
Wie wäre es den string umzudrehen: st[::-1]? *g*
Anonymous hat geschrieben:wäre das mit regex = '[A_Z]' so möglich?
Ich bin zwar nicht der Regex Spezialist, aber das sollte doch wohl eher [A-Z], oder besser \W sein, oder? Ich tät ja sowas nehmen: \W\d\d
Verfasst: Mittwoch 2. Februar 2005, 20:05
von Dookie
Hi Gast,
Ich würde versuchen den String entspechend mit re.findall() zu zerlegen und wenn dann dabei das Ergebnis drei Strings enthält diese zusammenzuführen.
Code: Alles auswählen
st = 'ABC_defgh_IjklmnR28'
tmp = re.findall(r"[A-Z]+_([a-z]+)_([a-zA-Z]+?)([A-Z][0-9]+)", st)
if tmp and len(tmp[0]) == 3:
erg = tmp[0][1] + "_" + tmp[0][2] + "_" + tmp[0][0]
else:
erg = st
Gruß
Dookie
Verfasst: Mittwoch 2. Februar 2005, 20:10
von Dookie
Hi Leonidas,
\W findet alle Nichtwortzeichen, also alle Zeichen ausser _[0-9][a-z][A-Z]
Für Grossbuchstaben musst du [A-Z] verwenden.
Gruß
Dookie
Verfasst: Mittwoch 2. Februar 2005, 21:07
von Leonidas
Dookie hat geschrieben:\W findet alle Nichtwortzeichen, also alle Zeichen ausser _[0-9][a-z][A-Z]
Für Grossbuchstaben musst du [A-Z] verwenden.
Ups, da habe ich wohl was falsch verstanden.
[X] Fixed.
Verfasst: Donnerstag 3. Februar 2005, 11:50
von Gast
Ui danke...
ich werd gleich schauen dass ich eure Ideen miteinbeziehe
Sers
Verfasst: Donnerstag 3. Februar 2005, 15:28
von Leonidas
Dann hätte ich noch eine Frage:
ich habe folgendes:
Code: Alles auswählen
st = "Tainted love von SOFT CELL"
st2 = "LENNY KRAVITZ: Stillness of heart"
Wie kann ich hier den Artist vom Titel trennen? Das dumme ist ja, das hat scheinbar nur die Regel, dass der Künstler groß geschrieben ist und der Titel komplett klein.
Verfasst: Donnerstag 3. Februar 2005, 15:58
von mawe
Hi Leonidas!
Das Problem ist auch dass das von im ersten String weder zum Titel noch zum Interpreten gehört. Oder kommt immer entweder ein : oder ein von vor. Dann könntest Du die Strings ja einfach nach den beiden splitten.
Den Interpreter ermittelst Du dann einfach mit isupper().
Gruß, mawe
Verfasst: Donnerstag 3. Februar 2005, 16:24
von Leonidas
Ich hab jetzt mit [A-Z]{2,} den Artist abgetrennt und das läuft jetzt, zumindest solange, wie die Sender ihre Seiten gescheit formatieren und nicht auf einmal sowas scheiben: "JAY - Z: LINKIN PARK", wo dummerweise der Titel fehlt.
Danke trotzdem.
Verfasst: Donnerstag 3. Februar 2005, 16:26
von jens
Ist nicht so das Gelbe vom Ei, filtert aber wunschgemäß...
Code: Alles auswählen
import re
st = "Tainted love von SOFT CELL"
# st = "LENNY KRAVITZ: Stillness of heart"
st = st.split(" ")
for i in st:
t = "".join(re.findall("([A-Z])", i))
if len(t)>2:
print t,
Verfasst: Donnerstag 3. Februar 2005, 16:42
von Leonidas
Meine Lösung war:
Code: Alles auswählen
def splittrack(trackname):
artistmatch = re.compile(r'[A-Z]{2,}')
artist = artistmatch.findall(trackname)
artist = reduce(lambda x, y: x + ' ' + y, artist)
title = trackname.replace(artist, '')
title = title.replace('von', '')
title = title.replace(':', '')
title = title.strip()
return (artist, title)
Nur die Replaces nerven mich ein wenig.