Regex aus Strings und Variablen zusammensetzen

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
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Samstag 10. März 2007, 01:48

Hallo,

habe meinen Lieblingsregex(CSV) in Python umgesetzt.

Code: Alles auswählen

import re

my_str = r''',22,"ffff","ee\eee","rtt,22z",221,,"g",'''

my_cre = re.compile(r'''
                 "([^"\\]*(?:\\.[^"\\]*)*)",?  # String in Anfuehrungszeichen(Komma erlaubt)
                | ([^,]+),?                        # ohne Anfuehrungszeichen(meist Ziffern)
                | ,                                    # oder nur ein Komma
                        ''',re.VERBOSE)

my_iter = my_cre.finditer(my_str)

my_list = []

for m in my_iter:
    if m.group(1): my_list.append(m.group(1))
    else:               my_list.append(m.group(2))

    
print my_list

[None, '22', 'ffff', 'ee\\eee', 'rtt,22z', '221', None, 'g']
Die Regex nehme ich auch gern für split. Habt Ihr eine Idee, wie ich das Komma gegen Semikolon oä. austauschen kann?

Gruß P.
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Samstag 10. März 2007, 02:05

hmmm
ich bin mir nicht sicher ob ich dein problem richtig verstanden habe, aber wie waers mit: 'a, str'.replace(',', ';')
cp != mv
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Samstag 10. März 2007, 08:30

PmanX hat geschrieben:Habt Ihr eine Idee, wie ich das Komma gegen Semikolon oä. austauschen kann?

Code: Alles auswählen

...
my_str = r''',22,"ffff","ee\eee","rtt,22z",221,,"g",123;456;"789:101112"'''

my_cre = re.compile(r'''
                ...
                | ([^,;]+),? # Einfach das ; mit hinzufügen.
                ...
''')

...   
print my_list
# [None, '22', 'ffff', 'ee\\eee', 'rtt,22z', '221', None, 'g', '123', '456', '789:101112']
BTW: Nur kurz getestet!
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Samstag 10. März 2007, 13:27

Hallo,
Costi hat geschrieben:hmmm
ich bin mir nicht sicher ob ich dein problem richtig verstanden habe, aber wie waers mit: 'a, str'.replace(',', ';')
Meine ersten Versuche sehen gut aus, danke.

Edit:

Code: Alles auswählen

re_str = r'''"([^"\\]*(?:\\.[^"\\]*)*)"~?|([^~]+)~?|~'''
#my_cre = re.compile(re_str.replace('~', trennstring))
my_cre = re.compile(re_str.replace('~', trennzeichen))
Gruß P.
Zuletzt geändert von PmanX am Samstag 10. März 2007, 13:58, insgesamt 1-mal geändert.
BlackJack

Samstag 10. März 2007, 13:46

Man könnte auch Zeichenkettenformatierung benutzen:

Code: Alles auswählen

    template = (r'"([^"\\]*(?:\\.[^"\\]*)*)"%(delim)s?'
                r'|([^%(delim)s]+)%(delim)s?|%(delim)s')

    my_cre = re.compile(template % {'delim': re.escape(trennstring)})
Und das Trennzeichen "escapen", für den Fall dass es eines ist, was in regulären Ausdrücken eine besondere Bedeutung hat.
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Samstag 10. März 2007, 14:11

TMTOWTDI. Guter Hinweis auf re.escape(trennzeichen).
Sehr direkt und klar :!:

EDIT: Wer's mal braucht.

Code: Alles auswählen

def my_split(zeile, trennzeichen = ','):
    tmplate = (r'"([^"\\]*(?:\\.[^"\\]*)*)"%(d)s?|([^%(d)s]+)%(d)s?|%(d)s')
    my_creg = re.compile(tmplate % {'d' : re.escape(trennzeichen)})
    my_iter = my_creg.finditer(zeile)
    my_list = []
    for i in my_iter:
        if i.group(1): my_list.append(i.group(1))
        else:          my_list.append(i.group(2))
    return my_list
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Samstag 10. März 2007, 21:44

Man möge sich streiten, wie vernünftig die folgende Lösung ist, aber das fiel mir irgendwie so ins Auge:

Aus

Code: Alles auswählen

my_iter = my_creg.finditer(zeile)
my_list = []
for i in my_iter:
    if i.group(1): my_list.append(i.group(1))
    else:          my_list.append(i.group(2))
return my_list
könnte man wunderschön folgendes machen:

Code: Alles auswählen

return [i.group(1) or i.group(2) for i in my_creg.finditer(zeile)]
Und JA: Ich hab sonst kein Leben :D
Antworten