re (Reguläre Ausdrücke) : Komplement?

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
Headwire
User
Beiträge: 2
Registriert: Donnerstag 23. Juni 2005, 13:33

[EDIT: ups falsches subforum .... sorry]

hi zusammen!

kann mir jemand sagen, wie man in python einen regulären ausdruck schreibt, der das komplement von einem anderen darstellt?

bsp.: ich will einen ausdruck der auf alles matcht was nicht auf "abc" matcht

quasi so eine art [^(?:abc)]

also:

input "abc" --> matcht nicht
input "dabc" --> matcht nicht
input "def" --> matcht
usw.

danke im voraus

p.s.: ich weiß, dass man z.b. mit

Code: Alles auswählen

if re.search("abc",string)==None: 
   passt
else:
   passt nicht
arbeiten könnte ... aber genau das darf ich hier nicht. ich brauche genau en komplementären ausdruck. gibt es laut theorie über reguläre sprachen etc. ja für jeden regulren ausdruck.

Edit (Leonidas): Verschoben.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

wie wäre es Du traust einfach Deiner eigenen Antwort?

Code: Alles auswählen

anti_regex = re.compile('[^abc])
Daraus lassen sich dann natürlich auch komplexere reguläre Ausdrücke ableiten.

Gruß,
Christian
Headwire
User
Beiträge: 2
Registriert: Donnerstag 23. Juni 2005, 13:33

ääähm .... nei. [^abc] steht für jedes EINZELNE zeichen, ausser a, b oder c .... also die zeichen d-z, A-Z, 0-9, \n, \s etc. ..... aber ich will ha nicht nur ein einzelnes zeichen "negieren", sondern eine gruppe von zeichen, bzw einen längeren string.

[^(?:abc)] geht aber leider nicht.
BlackJack

Headwire hat geschrieben:p.s.: ich weiß, dass man z.b. mit

Code: Alles auswählen

if re.search("abc",string)==None: 
   passt
else:
   passt nicht
arbeiten könnte ... aber genau das darf ich hier nicht.
Was heisst, das darfst Du nicht? Hausaufgabe?
ich brauche genau en komplementären ausdruck. gibt es laut theorie über reguläre sprachen etc. ja für jeden regulren ausdruck
Vorsicht: `regular expressions` in Python, Perl usw. sind keine regulären Sprachen im theoretischen Sinn. Das heisst mit der Komplementbildung bei den theoretischen regulären Sprachen bekommst Du nicht für jede `regular expression` das Komplement hin, sondern nur bei solchen, die sich auf die "Features" der theoretischen regulären Sprachen beschränken.
BlackJack

Ich nochmal. Aus "Theoretische Informatik - kurzgefasst" von Uwe Schöning:
Bemerkung: Da die regulären Ausdrücke gerade die regulären Sprachen beschreiben, muss es zu jedem regulären Ausdruck a einen Ausdruck b geben, der die Komplementsprache darstellt: [...]. Das heisst die Komplementbildung ist mittels Vereinigung, Produkt und Sternoperation darstellbar. Die entsprechende Konstruktion [...] ist jedoch sehr aufwändig, da sie die Stufen regulärer Ausdruck -> NFA -> DFA -> komplementärer DFA -> regulärer Ausdruck durchlaufen müsste.
Na dann viel Spass. :twisted:
Antworten