VB.NET REGEX in Python - unexpected end of pattern

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.
streetfox
User
Beiträge: 18
Registriert: Dienstag 27. Januar 2009, 12:23

Hello

die RE

Code: Alles auswählen

(?>([^;"]*("[^"]*")*[^;"]*)*)("[^"]*)?
funzt in .NET. Ich krieg die aber nicht in python hin. Es gibt mir immer eine unexpected end of pattern message.



Kann mir hier jemand weiterhelfen und auch wieso dass die in python nicht geht?

/edit.... RE korrigiert, ich benutze sie mit semikolon, statt komma...
Zuletzt geändert von streetfox am Mittwoch 28. Januar 2009, 18:18, insgesamt 3-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

streetfox hat geschrieben: die RE

Code: Alles auswählen

(?>([^,"]*("[^"]*")*[^,"]*)*)("[^"]*)?
funzt in .NET.
.NET ist doch keine Sprache!
streetfox
User
Beiträge: 18
Registriert: Dienstag 27. Januar 2009, 12:23

danke für den hinweis. VB.Net
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hyperion hat geschrieben:
streetfox hat geschrieben: die RE

Code: Alles auswählen

(?>([^,"]*("[^"]*")*[^,"]*)*)("[^"]*)?
funzt in .NET.
.NET ist doch keine Sprache!
In dem Fall ist es aber zutreffend, da die Regulären Ausdrücke aus der .NET Library kommen und somit in jeder Sprache gleich sind.
streetfox
User
Beiträge: 18
Registriert: Dienstag 27. Januar 2009, 12:23

jup....:
>>> retest = re.compile(r'(?>([^,"]*("[^"]*")*[^,"]*)*)("[^"]*)?')
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
retest = re.compile(r'(?>([^,"]*("[^"]*")*[^,"]*)*)("[^"]*)?')
File "C:\Python30\lib\re.py", line 203, in compile
return _compile(pattern, flags)
File "C:\Python30\lib\re.py", line 271, in _compile
p = sre_compile.compile(pattern, flags)
File "C:\Python30\lib\sre_compile.py", line 491, in compile
p = sre_parse.parse(p, flags)
File "C:\Python30\lib\sre_parse.py", line 692, in parse
p = _parse_sub(source, pattern, 0)
File "C:\Python30\lib\sre_parse.py", line 315, in _parse_sub
itemsappend(_parse(source, state))
File "C:\Python30\lib\sre_parse.py", line 627, in _parse
raise error("unexpected end of pattern")
sre_constants.error: unexpected end of pattern
/me editiert sich zu tode ;-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Leonidas hat geschrieben: In dem Fall ist es aber zutreffend, da die Regulären Ausdrücke aus der .NET Library kommen und somit in jeder Sprache gleich sind.
Hm ... ok. Ich dachte .NET garantiert nur eine Art "Binär-Kompatibilität" für unterschiedlichste Sprachen. Also gibt es aber auch einheitliche Sprachkonstrukte oder Vorschriften für .NET kompatible Sprachen?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Ich habe den Verdacht, Python verschluckt sich bereits direkt zu Anfang bei '(?' in der regex. Du öffnest dort eine Gruppe und erwartest dann höchstens ein Vorkommen des zuvor stehenden Ausdrucks. Nur steht dort zuvor nichts. Was genau willst Du an dieser Stelle bewirken?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hyperion hat geschrieben:Also gibt es aber auch einheitliche Sprachkonstrukte oder Vorschriften für .NET kompatible Sprachen?
Es gibt halt eine einheitliche Klassenlibrary, wie auf der JVM auch. Also quasi eine Stdlib. Einheitliche Sprachkonstrukte gibt es in dem Sinn nicht (also von CIL abgesehen, aber das programmiert niemand direkt).

@streetfox: was willst du denn eigentlich matchen?
streetfox
User
Beiträge: 18
Registriert: Dienstag 27. Januar 2009, 12:23

sie versucht sehr unschöne csv files zu parsen, ich benutze sie mit ";" und zu beginn sucht sie das semikolon/komma, sucht dann zurück obs wirklich ein spaltentrenner ist.
"Value1;";"Value2";"""Value3""";"of ""very"" ""difficult""";"";"expressions"
"and";"";"we should not ;""then""; forget";"that it
works ;"
as ""ss""
expected""
"And";"this ""is""";" a";"new start"
"And2";"this is a";"new start as well"
"only "this" line";" is malformat;ted "with" quotes"
zu

  • "Value1;"
    "Value2"
    """Value3"""
    "of ""very"" ""difficult"""
    ""
    "expressions"
    "and"
    ""
    "we should not ;""then""; forget"
    "that it /n works ;" /n as ""ss"" expected""
    "And"
    "this ""is"""
    " a"
    "new start"
    "And2"
    "this is a"
    "new start as well"
    "only "this" line"
    " is malformat;ted "with" quotes"
sehr praktisch, aber python will nicht. und ja, das CSV ist horror, kommt aber von einer legacy app.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Du weisst aber schon das es in Python einen CSV Reader gibt der dir die ganze Arbeit abnimmt?

Gruss
streetfox
User
Beiträge: 18
Registriert: Dienstag 27. Januar 2009, 12:23

Note
The reader is hard-coded to recognise either '\r' or '\n' as end-of-line, and ignores lineterminator. This behavior may change in the future.
bei

Code: Alles auswählen

"feld1";"text kommt auf eine
neue zeile
innerhalb des records";"geht nich"
da verschluckt sich der csv reader.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

streetfox
User
Beiträge: 18
Registriert: Dienstag 27. Januar 2009, 12:23

grins, also ist wohl eine andere Lösung besser als die erklärung warum sich hier python verschluckt :-)

ich probier pyparsing mal aus, kannte ich ned. Mich nimmt aber trotzdem wunder warum diese RE bei Python nicht klappt
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Pythons re-Modul kann ?< nicht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

PyParsing finde ich sinnlos, wenn die Stdlib bereits einen fertigen CSV-Parser mitbringt. Man könnte natürlich auch Pysec verwenden, und dort das CSV-Beispiel erweitern, aber wozu?

Das ist überigens wieder ein typischer Fall von XY-Problem gewesen. Die Lösung ist schon fertig und der Reguläre Ausdruck schlicht unnötig.

Und Reguläre Ausdrücke sind nicht gleich Reguläre Ausdrücke. Quasi jede Implementation unterstützt irgendwelche spezifischen Erweiterungen, die andere Implementationen nicht können. Die umfangreichste Implementierung ist wohl bei Perl und gleichzeitig so komplex, dass nichtmal PCRE (Perl Compatible Regular Expressions) alle Features unterstützt.
streetfox
User
Beiträge: 18
Registriert: Dienstag 27. Januar 2009, 12:23

ich find die kommentare vom admin zum 2ten und letzten mal hier auch sinnlos, doch das interessiert auch niemanden.

danke audax für die hilfe. Ich versuch halt die RE irgendwie selber umzuschreiben. Ich denk ich belass das mal hier, da vergeht einem ja die lust am sich beteiligen.

Gruss
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Warum soll der csv-Reader sich da verschlucken? Hast du das denn getestet? Die Dokumentation sagt ja nur, dass ``lineterminator`` gerade ignoriert wird, nicht aber, dass newlines nicht gehen.

Code: Alles auswählen

DATA = '''"Value1;";"Value2";"""Value3""";"of ""very"" ""difficult""";"";"expressions" 
"and";"";"we should not ;""then""; forget";"that it 
works ;" 
as ""ss"" 
expected"" 
"And";"this ""is""";" a";"new start" 
"And2";"this is a";"new start as well" 
"only "this" line";" is malformat;ted "with" quotes"'''

rows = list(csv.reader(DATA.splitlines(True), delimiter=';'))
print rows
scheint jedenfalls zu funktionieren.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Du hast doch einen an der Waffel, zumindest bist du etwas arg empfindlich. Leonidas Worte über RegExp sind absolut wahr, da kocht einfach jeder sein eigenes Süppchen. Einzig die POSIX-kompatiblen funktionieren eigentlich überall (jedenfalls gibts eigentlich immer ne Bibliothek die das kann).

@Leonidas:
Das Problem an dem in der StdLib ist, dass er mit Multiline Feldern nicht klarkommt, ich habs auch grad probiert.
streetfox
User
Beiträge: 18
Registriert: Dienstag 27. Januar 2009, 12:23

Jungs, bitte.

Ob wahr oder nicht, steht doch nicht zur debatte. Die Frage geht um die REGEXP. Dass Leonidas recht hat mit der eigenen Suppe is ja ok. Aber die Meinung hilft dem Problem nun mal nicht weiter.

Ich mag nun mal nicht wenn irgendwelche gescheiten leute die ganze zeit was zu motzen haben. In foren solls schliesslich sachlich zu und her gehen.

Ich ess jetzt meine Waffel ist zeit dazu ... das einzige Problem an der Sache ist, das ich halt weniger über Python lern und wieder VB mach. Meinetwegen.

Dann seid ihr glücklich und ich auch.

@Trundle:

leider ned:
[['Value1;', 'Value2', '"Value3"', 'of "very" "difficult"', '', 'expressions'], ['and', '', 'we should not ;"then"; forget', 'that it \nworks ;'], ['as ""ss""'], ['expected""'], ['And', 'this "is"', ' a', 'new start'], ['And2', 'this is a', 'new start as well'], ['only this" line"', ' is malformat;ted with" quotes"']]
[/code]
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Deine Frage war: "Warum geht der Ausdruck nicht"

Leonidas (und auch andere) sagen "Geht nicht, weil jeder sein eigenes Süppchen kocht. Entweder du benutzt das CSV Modul und guckst, was noch kann (gibt verschiedene Quoting Optionen und so... vllt klappt was. Wenn nicht, musst du selber was implementieren (sind auch komische CSV-Daten)"

...so? Das Problem seh ich dabei nicht oO'' Aber wenn du so unglücklich über die Antworten bist...
Antworten