Seite 1 von 1
Hilfe: Regulärer Ausdruck gesucht!
Verfasst: Dienstag 27. Mai 2003, 14:35
von Christina
Hey,
ich bin noch sehr ungeübt mit regulären Ausdrücken. Kann mir jemand spontan sagen, wie ich festellen kann, ob ein String (3 Zeichen lang) Buchstaben von A bis Z außer G und P enthält?
Das wäre suuuuuper nett!
grüße
c

Re: Hilfe: Regulärer Ausdruck gesucht!
Verfasst: Dienstag 27. Mai 2003, 14:49
von Voges
Hallo!
Ganz spontan:
Code: Alles auswählen
import re
text = "ABC"
if re.search(r"^[A-FH-OQ-Z]{3}$",text):
print "ok"
hth
Jan
Verfasst: Dienstag 27. Mai 2003, 15:00
von Glamdring
Ich hab auch ne Idee, aber da ich mich mit REs nicht auskenne, versuch ichs anders.
Das müsste auch gehen:
Code: Alles auswählen
import string
def Ersatz():
Vorrat = "abcdefhijklmnoqrstuvwxyz"
dat = file(Name_der_Datei, "r")
text = dat.read()
text = string.lower(text)
for x in text:
if x in Vorrat:
return 1
elif x not in Vorrat:
return 0
else:
print "Text ist leer"
Ersatz()
Verfasst: Dienstag 27. Mai 2003, 15:03
von Christina
Hi Jan,
danke für deinen vorschlag. ich habe aber das mal ausprobiert:
text = "APA"
dies sollte sollte eigentlich nicht funktionieren (P soll nicht dabei sein). mein test war aber leider positiv...
Verfasst: Dienstag 27. Mai 2003, 15:10
von Voges
Christina hat geschrieben:text = "APA"
dies sollte sollte eigentlich nicht funktionieren (P soll nicht dabei sein). mein test war aber leider positiv...
Kann nicht sein. Großschreibung beachtet?
Jan
Verfasst: Dienstag 27. Mai 2003, 15:14
von Christina
Also ich habe da jetzt eine kurze Lösung:
Code: Alles auswählen
text = "APA"
result = re.match('[A-FH-OQ-Z]{1,3}$', text);
Jan: Vielen Dank für deinen Vorschlag!!!
Ciao
c

Verfasst: Dienstag 27. Mai 2003, 15:26
von Voges
Christina hat geschrieben:
Damit akzeptierst Du aber auch Zeichenketten, die kürzer als 3 Zeichen sind.
Jan
Verfasst: Dienstag 27. Mai 2003, 16:47
von Kartoffel
Mein Vorschlag wäre:
Code: Alles auswählen
text = "ABC"
forbidden =["G","P"]
def test(text, lang=3, verboten=forbidden ):
if len(text)==3:
for i in [1,2,3]:
if text[i]in verboten: return "verbotener Buchstabe"
return "richtig"
else: return "falsche Laenge"
print test(text)
Ist etwas durchschaubarer als die re.search-Methode und universelll einsetzbarer.
Um ehrlich zu sein hab ich das nur als kleine Möglichkeit angesehen, etwas Programmiererfahrung zu sammeln, aber da das Ergebnis ganz gut aussieht, "veröffentliche" ich es mal
Es scheint sogar zu funktionieren (mein erstes funktionierendes Prog - Juhu

)
Verfasst: Dienstag 27. Mai 2003, 17:03
von Voges
Kartoffel hat geschrieben:Es scheint sogar zu funktionieren (mein erstes funktionierendes Prog - Juhu

)
Hast Du das getestet? Du greifst mit text[3] hinter den String. Das müsste ein
IndexError: string index out of range zur Folge haben. Abgesehen davon erkennt Deine Funktion auch "&%$" als richtig.
Jan
Verfasst: Dienstag 27. Mai 2003, 17:08
von Kartoffel

Stimmt, Der index müsste mit 0 beginnen und mit 2 enden
(Habs aber getestet und deinen Fehler bekommen - seltsam)
An Sonderzeichen habe ich gar nicht gedacht

Verfasst: Dienstag 27. Mai 2003, 17:16
von Voges
Hallo!
Da offensichtlich Bedarf nach einer RE-freien Variante besteht (ohne Prüfung auf Länge):
Code: Alles auswählen
text = "ABC"
if not [0 for ch in text if ch not in "ABCDEFHIJKLMNOQRSTUVWXYZ"]:
print "ok"
Und da soll noch einer behaupten, reguläre Ausdrücke seien schwer lesbar

Jan
Verfasst: Dienstag 27. Mai 2003, 19:09
von Kartoffel

Bei mir haben sich wohl 2 Fehler gegenseitig quasi ausgelöscht
(zumindest hat man sie nicht mehr so ohne weiteres entdeckt )
Hier mal eine überarbeitete und ausgiebig getestete Version:
Code: Alles auswählen
from string import ascii_uppercase
text = "ABC"
forbidden =["G","P"]
def test(text, lang=3, verboten=forbidden ):
try:
if len(text)==3:
for i in range(0,lang):
if type(text[i]) is not str: raise TypeError
if not text[i] in ascii_uppercase or text[i]in verboten: return "verbotener Buchstabe"
return "richtig"
else: return "falsche Laenge"
except TypeError:
return "falscher Typ"
print test(text)
Der müsste jetzt eigentlich funktionieren
Verfasst: Dienstag 27. Mai 2003, 20:31
von Dookie
Hallo,
habe mal nen wilden "einzeiler" gemacht
Code: Alles auswählen
def charcheck(totest):
return len(totest) == 3 and min([x in reduce(lambda x,y: x + chr(y), range(ord("A"), ord("G")) + range(ord("H"), ord("P")) + range(ord("Q"), ord("Z")+ 1), "") for x in totest])
Gruß
Dookie
Verfasst: Mittwoch 28. Mai 2003, 17:57
von Milan
da hier jeder seinen Senf abgeben hat, will ich das auch noch mal tun
Code: Alles auswählen
f=lambda x:len(x)==3 and 'G' not in x and 'P' not in x
Verfasst: Mittwoch 28. Mai 2003, 18:46
von Glamdring
Ich hab noch ne Idee!
Code: Alles auswählen
from string import *
def such_hasso_such(text):
Vorrat = "abcdefhijklmnoqrstuvwxyz"
text = text.lower()
if len(text) == 3:
for i in text:
if i not in Vorrat:
erg = 1
else:
erg = 0
else:
erg = 0
return erg
Verfasst: Mittwoch 28. Mai 2003, 19:08
von Voges
Vorher testen wäre nicht schlecht

. Dein Programm gibt z.B. für "pgh", "54u" und "abc" immer 0 zurück.
Jan
Verfasst: Mittwoch 28. Mai 2003, 20:01
von Voges
Noch 'ne Möglichkeit:
Code: Alles auswählen
Python 2.3b1 (#40, Apr 25 2003, 19:06:24) [MSC v.1200 32 bit (Intel)] on win3
Type "help", "copyright", "credits" or "license" for more information.
>>> import sets
>>> sets.Set("ASD").issubset(sets.Set("ABCDEFHIJKLMNOQRSTUVWXYZ"))
True
>>> sets.Set("DFG").issubset(sets.Set("ABCDEFHIJKLMNOQRSTUVWXYZ"))
False
>>>
Jan
Verfasst: Donnerstag 29. Mai 2003, 15:00
von Milan
hmmm... würde ich mir ja gerne mal näher anschauen, aber es gibt bei mir kein Modul sets. In der offizellen Modulliste auch nicht.
Verfasst: Freitag 30. Mai 2003, 07:03
von Voges
Hallo!
Milan hat geschrieben:hmmm... würde ich mir ja gerne mal näher anschauen, aber es gibt bei mir kein Modul sets. In der offizellen Modulliste auch nicht.
Gibt es auch erst ab Version 2.3. Eine knappe Beschreibung von Sets gibt's hier:
http://www.python.org/doc/2.3b1/whatsnew/node2.html
Jan