RegEx: Durchsuchen einer Liste

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
GameChanger
User
Beiträge: 14
Registriert: Dienstag 21. Februar 2017, 15:14

Schönen Nachmittag,

ich beschäftige mich seit kurzem mit RegExs.
Zuerst hab ich es verwendet um ein .txt nach "Patterns" zu ruchsuchen, und das hat auch ersklassig geklappt.

Nun würde ich gerne eine Liste nach bestimmten "Mustern" filtern.

hier mein Ansatz:

[code

Code: Alles auswählen

import re

y = ["Try1","Try2","dummy_Try8","Try4","dummy_Try5"]

for x in y:
    listneu = re.findall("dummy_[\w]?[\w]?[\w]?[\w]?[\w]?[\w]?[\w]?[\w]?[\w]?",x)
    
print(y)

print("--------------")
print(listneu)
Einschub: gibt es für

Code: Alles auswählen

("dummy_[\w]?[\w]?[\w]?[\w]?[\w]?[\w]?[\w]?[\w]?[\w]?",x)
eine "schönere" Lösung?

Die Ausgabe ist:
[code

Code: Alles auswählen

>>> 
['Try1', 'Try2', 'dummy_Try8', 'Try4', 'dummy_Try5']
--------------
['dummy_Try5']
>>> 
ich hätte jedoch gerne:

[code

Code: Alles auswählen

>>> 
['Try1', 'Try2', 'dummy_Try8', 'Try4', 'dummy_Try5']
--------------
['dummy_Try8','dummy_Try5']
>>> 
Wo liegt mein Denkfehler?

#thx
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Denkfehler liegt im ueberschreiben der bereits ermittelten Ergebnisse. Du musst erweitern, nicht ersetzen.

Und in der Doku zu regular Expressions steht auch recht nett beschrieben, wie man so etwas kompakter machen kann.

https://docs.python.org/2/library/re.ht ... ion-syntax

Code: Alles auswählen

import re

y = ["Try1","Try2","dummy_Try8","Try4","dummy_Try5"]

listneu = []
for x in y:
    listneu.extend(re.findall("dummy_\w{0,9}", x))

print(y)

print("--------------")
print(listneu)
Zuletzt geändert von Anonymous am Mittwoch 8. März 2017, 14:48, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
GameChanger
User
Beiträge: 14
Registriert: Dienstag 21. Februar 2017, 15:14

__deets__ hat geschrieben:Der Denkfehler liegt im ueberschreiben der bereits ermittelten Ergebnisse. Du musst erweitern, nicht ersetzen.

Und in der Doku zu regular Expressions steht auch recht nett beschrieben, wie man so etwas kompakter machen kann.

https://docs.python.org/2/library/re.ht ... ion-syntax

Code: Alles auswählen

import re

y = ["Try1","Try2","dummy_Try8","Try4","dummy_Try5"]

listneu = []
for x in y:
    listneu.extend(re.findall("dummy_\w{0,9}", x))

print(y)

print("--------------")
print(listneu)

Dankeschön! :)

da ich die doku im moment bearbeite, habe ich das mit {} bereits versucht, hatte dann aber ws an anderer stelle einen fehler.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@GameChanger: filtern hört sich für mich eher danach an, dass Du prüfen willst, ob ein Listeneintrag dem Pattern entspricht, statt zu alle Teile der Einträge, die dem Pattern entsprechen zu sammeln, also das:

Code: Alles auswählen

import re
 
y = ["Try1","Try2","dummy_Try8","Try4","dummy_Try5"]
 
listneu = []
for x in y:
    if re.match("^dummy_\w{0,9}$", x):
        listneu.append(x) 
oder kurz:

Code: Alles auswählen

listneu = [x for x in y if re.match("^dummy_\w{0,9}$", x)]
GameChanger
User
Beiträge: 14
Registriert: Dienstag 21. Februar 2017, 15:14

Sirius3 hat geschrieben:@GameChanger: filtern hört sich für mich eher danach an, dass Du prüfen willst, ob ein Listeneintrag dem Pattern entspricht, statt zu alle Teile der Einträge, die dem Pattern entsprechen zu sammeln, also das:

Code: Alles auswählen

import re
 
y = ["Try1","Try2","dummy_Try8","Try4","dummy_Try5"]
 
listneu = []
for x in y:
    if re.match("^dummy_\w{0,9}$", x):
        listneu.append(x) 
oder kurz:

Code: Alles auswählen

listneu = [x for x in y if re.match("^dummy_\w{0,9}$", x)]

Das hat bis vor ein paar minuten perfekt funktioniert.

hab ich jetzt plötzlich einen firmalen fehler?!

Code: Alles auswählen

guck = []

for x in FIds_list:
    if x not in FIds_list_BMW:
          guck.append(x)

print(guck[1:10])
print(len(guck))
print(type(guck))

dummies = [y for y in guck if re.match("^Dummy_FId_\w{0-35}$",y)]


print("-----------------")
print("---!!!----Dummies---!!!----:",dummies)
print("---!!!----Dummies---!!!----:",len(dummies))                   
print("-----------------")

Ausgabe:

Code: Alles auswählen

['FId_MoFStrtModDetnRqEngrPfn', 'FId_MoFVarST_VRS_GRB', 'Dummy_FId_ComStFaultIndSysActv1', 'Dummy_FId_ComStFaultIndSysActv2', 'Dummy_FId_ComStFaultIndSysActv3', 'Dummy_FId_ComStFaultIndSysActv4', 'FID_Com_Dienste19BLIGHTFIRM', 'FID_Com_Dienste19BRAKEFN', 'FID_Com_Dienste19CLIMATECOOLSYS']
1571
<class 'list'>
-----------------
---!!!----Dummies---!!!----: []
---!!!----Dummies---!!!----: 0
-----------------
BlackJack

@GameChanger: Ein Komma ist halt etwas anderes als ein Minuszeichen. :-)
GameChanger
User
Beiträge: 14
Registriert: Dienstag 21. Februar 2017, 15:14

BlackJack hat geschrieben:@GameChanger: Ein Komma ist halt etwas anderes als ein Minuszeichen. :-)

hahah, zeit für mich für heute aufzuhören.


BTW: dieses Forum ist eine echte Institution.


EDIT: funktioniert trotzdem nicht. :/



Das funktionert:

Code: Alles auswählen

g1 = []

for f in guck:
    g1.extend(re.findall("Dummy_FId_\w{0,35}",f))
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@GameChanger: guck, tut:

Code: Alles auswählen

>>> import re
>>> guck = ['FId_MoFStrtModDetnRqEngrPfn', 'FId_MoFVarST_VRS_GRB', 'Dummy_FId_ComStFaultIndSysActv1', 'Dummy_FId_ComStFaultIndSysActv2', 'Dummy_FId_ComStFaultIndSysActv3', 'Dummy_FId_ComStFaultIndSysActv4', 'FID_Com_Dienste19BLIGHTFIRM', 'FID_Com_Dienste19BRAKEFN', 'FID_Com_Dienste19CLIMATECOOLSYS']
>>> [y for y in guck if re.match("^Dummy_FId_\w{0,35}$",y)]
['Dummy_FId_ComStFaultIndSysActv1', 'Dummy_FId_ComStFaultIndSysActv2', 'Dummy_FId_ComStFaultIndSysActv3', 'Dummy_FId_ComStFaultIndSysActv4']
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Code: Alles auswählen

[x for x in xs if x.startswith('Dummy_')]
Warum sollte man für einen solch trivialen Fall reguläre Ausdrücke verwenden?
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
BlackJack

@bwbg: Weil das nicht das gleiche macht‽
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Nein, natürlich nicht. Führt aber zu dem gewünschten Ergebnis.

Das Prädikat könnte man aber auch in eine Funktion auslagern und direkt filtern.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Die bisher gezeigten Beispiele erfordern keine Mustererkennung. Falls die tatsächliche Anwendung nicht komplexer wird, wäre ein simples 'startswith', wie von bwbg vorgeschlagen, auch meine Empfehlung.
Antworten