regex mit variablem Parameter

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
pauledd
User
Beiträge: 5
Registriert: Freitag 29. Juni 2018, 07:52

Hi

Ich möchte in einem String (tmp) nach einer Liste von Char's (signals) suchen und bei einem match soll er
die Stelle in der Liste und den Char selbst ausgeben

Code: Alles auswählen

import re

signals = ['!','"','#','$','%']
tmp = 'fg2c0"'

def find_sig(sig):
    for i,j in enumerate(signals):
        if re.search(j,sig):
            print("{},{}".format(i,j))

find_sig(tmp)
wenn ich das so ausführe bekomme ich:

Code: Alles auswählen

1,"
3,$
Die Eins stimmt ja, aber warum gibt er noch das Dollarzeichen aus?
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ich frage mich, ob es nicht sinnvoller wäre, einmal über die Zeichen von tmp zu iterieren, die signals in ein set (statt einer Liste) zu packen und dann zu schauen ob das Zeichen aus tmp in dem set enthalten ist.
Klingt schneller als das, was du hier mit regulären Ausdrücken tust.

Edit: Ah, ich sehe gerade, du brauchst die Stelle aus der Liste, nicht aus tmp. Trotzdem würde ich bei der Suche nach einem einzelnen Zeichen keine regulären Ausdrücke bemühen. Wenn du nur wissen willst, ob das Zeichen überhaupt irgendwo enthalten ist, tut es auch .find() (mit Position) auf dem String oder "in" (ohne Position).

Die Variablennamen laden übrigens zum raten ein. Wenn du in deinem Text erklären musst, was dein Code tut, weil die Variablen nur aus einem Buchstaben bestehen, weißt auch du in zwei Wochen nicht mehr, was du da tun wolltest.
Zuletzt geändert von sparrow am Freitag 15. Februar 2019, 09:36, insgesamt 2-mal geändert.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine Funktion, die `find_sig` heißt, läßt vermuten, dass sie ein Suchergebnis zurückliefert. Reguläre Ausdrücke sind in Deinem Fall falsch. Zum einen, weil Sonderzeichen interpretiert werden, und zum zweiten, weil ein einfaches `in` ausreichen würde. Wenn `signals` eine Konstante ist, schreibt man sie `SIGNALS`, falls nicht, muß sie ein Parameter von `find_sig` sein. `j` ist ein schlechter Name für ein Signal und `sig` ein schlechter für einen String der Signale enthält. `tmp` würde ich mit Temperatur in Verbindung bringen, passt aber irgendwie nicht.
pauledd
User
Beiträge: 5
Registriert: Freitag 29. Juni 2018, 07:52

Okay, danke, ich versuche es mal selbst mit euren Tips hinzubekommen.
pauledd
User
Beiträge: 5
Registriert: Freitag 29. Juni 2018, 07:52

So klappts erstmal:

Code: Alles auswählen

SIGNALS = ['!','"','#','$','%']
TEXT = 'fg2c0!'
TEXT2 = 'fg2$c0'

def find_sig(input):
    for num,sig in enumerate(SIGNALS):
        if sig in input:
            print("{},{}".format(num,sig))

find_sig(TEXT)
find_sig(TEXT2)

Code: Alles auswählen

0,!
3,$
Antworten