Seite 1 von 1

strings vergleichen

Verfasst: Dienstag 7. März 2006, 17:52
von scrowface
Hi,
Ich habe eine Liste von Strings und moechte ihre elemente iterativ in einer For-schleife
zunaechst mit einem vorgebenen String vergleichen(if-Anweisung) bevor sie dann bestimmte Operationen durchfuehren.
Wie geht das?
Ich habe mir bereits re angeguckt,finde allerdings keine passende Methode.Eine Idee?
ps:sorry falls die Frage euch "too simple" vorkommen sollte,ich bin naemlich noch ein Anfaenger.'verspreche Besserung...

Verfasst: Dienstag 7. März 2006, 18:26
von Kolazomai
Hi,

wenn ich das richtig verstehe, hast du also eine Menge von Strings und willst die mit einem String vergleichen. Wenn 1 String in der Menge mit dem String übereinstimmt, soll irgendetwas passieren:

1.) Ohne for-schleife,sondern if-statement

Code: Alles auswählen

x = "gesuchter string"
a = ["menge","mit","den","strings"]

if x in a:
   print x,"ist in a"
2.) for-schleife

Code: Alles auswählen

gesucht = "gesuchter string"
a = ["menge","mit","den","strings"]
for x in a:
     if x == gesucht:
          print "mach das und das"
          break #?
Hoffe , es is das was du meinst.

Mfg,

Kolazomai

Verfasst: Dienstag 7. März 2006, 18:35
von scrowface
nicht wirklich.
Die Strings in der Liste koennten Dateiennamen mit einer Endung(.py zum Beispiel) sein und x wuerde ein teil von dem Wort vor der Endung entsprechen also:

a=["uvw2.jpg","abc4.gif"]

//und so haette ich es gerne(syntax nur fuer das Beispiel also bitte nicht gruen werden):
if(x="uvw")

do anything

....

Ich muss also zunaechst aus dem Element der Liste ein String extrahieren,den ich dann mit x vergleiche.

Verfasst: Dienstag 7. März 2006, 18:53
von helmut
Sieh Dir mal den Variablentyp String und seine Methoden an.

Gruss, Helmut

Verfasst: Dienstag 7. März 2006, 19:16
von Buell
Das müsste mit der String Funktion find(string,suchstring) funktionieren, also in etwa so:

Code: Alles auswählen

x = "gesuchter string"
a = ["menge.py","mit","den","strings"]

for s in a:
       if string.find(s,x):
              print "Treffer"
^kein getesteter Code!

Verfasst: Dienstag 7. März 2006, 19:36
von knekke
Ich hab auch mal sowas in der art gebraucht.... vieleicht hilft es weiter

Code: Alles auswählen

import re
searchstring = "string" #suchbegriff
a = ["menge","mit","den","strings"]

pattern = re.compile('.*%s.*' % (searchstring), re.I) #re.I sorgt dafür, dass es nicht case-sensitiv ist
for element in a:
    if pattern.match(element):
        print element

Verfasst: Dienstag 7. März 2006, 21:42
von BlackJack
knekke hat geschrieben:

Code: Alles auswählen

import re
searchstring = "string" #suchbegriff
a = ["menge","mit","den","strings"]

pattern = re.compile('.*%s.*' % (searchstring), re.I) #re.I sorgt dafür, dass es nicht case-sensitiv ist
for element in a:
    if pattern.match(element):
        print element
Ich find' man schiesst für so ein Problem mit `re` mit Kanonen auf Spatzen. Die Zeichenkette(n) in Kleinbuchstaben umwandeln und dann mit ``in`` den `searchstring` zu suchen ist wohl kürzer und einfacher zu verstehen.

Bei Deiner `re`-Lösung würde ich den `searchstring` aber unbedingt noch durch `re.escape()` jagen, damit keine Probleme entstehen, wenn der `searchstring` etwas enthält was in einem regulären Ausdruck eine besondere Bedeutung hat.

Verfasst: Dienstag 7. März 2006, 22:06
von r2d2

Code: Alles auswählen

x = "gesuchter string"
a = ["menge.py","mit","den","strings"]

liste_aus_x = x.split()
# ergibt ["gesuchter","string"]

for s in a:
       if s in liste_aus_x:
              print "Treffer"
ohne kommentar

r2d2

Verfasst: Mittwoch 8. März 2006, 13:48
von Kolazomai
r2d2 hat geschrieben:

Code: Alles auswählen

x = "gesuchter string"
a = ["menge.py","mit","den","strings"]

liste_aus_x = x.split()
# ergibt ["gesuchter","string"]

for s in a:
       if s in liste_aus_x:
              print "Treffer"
ohne kommentar

r2d2
Was ist, wenn in a ["la.py","etc.usw"] steht und der gesuchte string y ist ? Dann wird la.py als Treffer angezeigt, obwohl er
Die Strings in der Liste koennten Dateiennamen mit einer Endung(.py zum Beispiel) sein und x wuerde ein teil von dem Wort vor der Endung entsprechen
will. Also sollte / müsste man jeweils das s nochmal beim . splitten und nur jedes 2te Argument hernehmen. Danach stellt sich aber wieder das problem ,was passiert wenn die Datei "Version1.0.3.4.py" heisst ? Deshalb ne Schleife , die die letzten Buchstaben [-x] auf einen punkt überprüft und dann ggfls abschneidet ?

Ausserdem soll ja , soweit ich das verstanden habe, der gesuchte String auch nur ein Teil der Dateiname ( Endung weglassend ) sein können.

Mfg,

Kolazomai

Verfasst: Mittwoch 8. März 2006, 16:43
von r2d2
dann muss der programmierer dafür sorgen, dass die liste a die entsprechenden werte auf enthält.

Code: Alles auswählen

nicht: a = ["menge.py","mit","den","strings"]
sondern: a = ["menge", "py", "mit", "den", "strings"]
dies sollte idealerweise schon bei erstellen der liste passieren.

dann kann man den string mit

Code: Alles auswählen

liste_aus_x = x.replace('.', ' ').split()
splitten

zugegeben ein etwas umständlicher weg.
hätte ich kenntnis über die anderen bestandteile des programmes, könnte ich sicherlich einen effizienteren weg vorschlagen
im moment ist nicht mal klar, woher die werten im a kommen, und ob man diese liste schon bei der erstellung "passend" speichern kann.

kommt mir etwas wie die blindgeburt im mittelalter vor, wo der arzt der frau bei der entbindung nicht unter den rock gucken durfte.

r2d2

Verfasst: Mittwoch 8. März 2006, 17:07
von Kolazomai
Hihi,

ja :D

das mit dem Split könnte ja auch ned funktionieren, wie ich angedeutet hab oben, weil mehrere . ja vorkommen könnten, die nicht nur das den Übergang zum Datei-Ende ankündigen.

Vielleicht schmeisst uns noch paar Fetzen Code her ? Dir wird sicher keiner was klauen :P

OpenSource 4tw ;)

Mfg,

Kolazomai

Verfasst: Mittwoch 8. März 2006, 17:37
von rayo
Hi

Also irgendwie hab ich das gefühl, dass ihr die Antwort schon lange geschrieben habt.

Was er suchte war glaubs einfach ein:

Code: Alles auswählen

item.find(suchstring)
und bisher hat er ja nicht mehr geantwortet.

Gruss

Verfasst: Freitag 10. März 2006, 09:56
von scrowface
Keine Sorge rayo,
ich habe mir das alles bereits angeguckt und dein Vorschlag hat mir sehr geholfen.
Ich bin nur genervt, weil ich nicht selbst darauf gekommen bin...

Beweis:

*&$#%^ = scrowface in rage!