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

Regex aus Strings und Variablen zusammensetzen

Beitragvon PmanX » 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

Beitragvon Costi » 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

Re: Regex aus Strings und Variablen zusammensetzen

Beitragvon sape » 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!
BlackJack

Beitragvon BlackJack » Samstag 10. März 2007, 11:35

Code: Alles auswählen

import csv
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Beitragvon PmanX » 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

Beitragvon 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:

Beitragvon PmanX » 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: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » 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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]