Hilfe: Regulärer Ausdruck gesucht!

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
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 :shock:
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

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
Glamdring
User
Beiträge: 104
Registriert: Sonntag 25. Mai 2003, 20:22
Wohnort: Freiburg i.B.
Kontaktdaten:

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()
Dies ist ein Platzhalter, er steht am Ende jeder meiner Beiträge! Erst wenn ich einen vernünftigen Text gefunden habe wird sich das ändern!
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...
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

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
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 :o
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Christina hat geschrieben:

Code: Alles auswählen

result = re.match('[A-FH-OQ-Z]{1,3}$', text);
Damit akzeptierst Du aber auch Zeichenketten, die kürzer als 3 Zeichen sind.
Jan
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

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 :lol: )
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Kartoffel hat geschrieben:Es scheint sogar zu funktionieren (mein erstes funktionierendes Prog - Juhu :lol: )
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
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

:oops: 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 :oops: :oops:
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

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
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

:oops: 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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hallo,

habe mal nen wilden "einzeiler" gemacht :shock:

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
Zuletzt geändert von Milan am Dienstag 22. Juli 2003, 12:43, insgesamt 1-mal geändert.
Glamdring
User
Beiträge: 104
Registriert: Sonntag 25. Mai 2003, 20:22
Wohnort: Freiburg i.B.
Kontaktdaten:

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

Dies ist ein Platzhalter, er steht am Ende jeder meiner Beiträge! Erst wenn ich einen vernünftigen Text gefunden habe wird sich das ändern!
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Vorher testen wäre nicht schlecht ;-). Dein Programm gibt z.B. für "pgh", "54u" und "abc" immer 0 zurück.
Jan
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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.
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

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
Antworten