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

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?

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.