Regex --> Upper Lower case

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
Gast

Mittwoch 2. Februar 2005, 18:25

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!!!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 2. Februar 2005, 18:44

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
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Mittwoch 2. Februar 2005, 20:05

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
[code]#!/usr/bin/env python
import this[/code]
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Mittwoch 2. Februar 2005, 20:10

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
[code]#!/usr/bin/env python
import this[/code]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 2. Februar 2005, 21:07

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Gast

Donnerstag 3. Februar 2005, 11:50

Ui danke...
ich werd gleich schauen dass ich eure Ideen miteinbeziehe ;)

Sers
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 3. Februar 2005, 15:28

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Donnerstag 3. Februar 2005, 15:58

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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 3. Februar 2005, 16:24

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 3. Februar 2005, 16:26

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,
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 3. Februar 2005, 16:42

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten