Seite 1 von 1
RegEx: Durchsuchen einer Liste
Verfasst: Mittwoch 8. März 2017, 14:39
von GameChanger
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
Re: RegEx: Durchsuchen einer Liste
Verfasst: Mittwoch 8. März 2017, 14:47
von __deets__
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)
Re: RegEx: Durchsuchen einer Liste
Verfasst: Mittwoch 8. März 2017, 14:55
von GameChanger
__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.
Re: RegEx: Durchsuchen einer Liste
Verfasst: Mittwoch 8. März 2017, 14:59
von Sirius3
@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)]
Re: RegEx: Durchsuchen einer Liste
Verfasst: Mittwoch 8. März 2017, 15:50
von GameChanger
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
-----------------
Re: RegEx: Durchsuchen einer Liste
Verfasst: Mittwoch 8. März 2017, 15:58
von BlackJack
@GameChanger: Ein Komma ist halt etwas anderes als ein Minuszeichen.

Re: RegEx: Durchsuchen einer Liste
Verfasst: Mittwoch 8. März 2017, 16:03
von GameChanger
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))
Re: RegEx: Durchsuchen einer Liste
Verfasst: Mittwoch 8. März 2017, 17:49
von Sirius3
@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']
Re: RegEx: Durchsuchen einer Liste
Verfasst: Mittwoch 8. März 2017, 23:18
von bwbg
Warum sollte man für einen solch trivialen Fall reguläre Ausdrücke verwenden?
Re: RegEx: Durchsuchen einer Liste
Verfasst: Donnerstag 9. März 2017, 00:01
von BlackJack
@bwbg: Weil das nicht das gleiche macht‽
Re: RegEx: Durchsuchen einer Liste
Verfasst: Samstag 11. März 2017, 10:13
von bwbg
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.
Re: RegEx: Durchsuchen einer Liste
Verfasst: Samstag 11. März 2017, 11:46
von kbr
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.