Seite 1 von 1

Reguläre Ausdrücke

Verfasst: Montag 28. August 2017, 16:04
von grafnox
Hallo!
Ich bin noch etwas ungeübt in Python, besonders was die reguläre Ausdrücke angeht.
Ich habe eine Liste von Strings. Unter diesen Strings suche ich alle, die das Zeichen "=" beinhalten.
Wie mache ich das am besten?

Die Liste kann beispielsweise folgende Strings beinhalten: P = 20%, DEZ = 10, FBW = max usw.
Was ich bis jetzt hinbekommen habe, ist es mit re.findall("=.*", string) den letzten Teil herauszubekommen, sprich: = 20%, = 10, = max usw.
Wie kriege ich das, was davor steht?

Gruß

Re: Reguläre Ausdrücke

Verfasst: Montag 28. August 2017, 16:07
von __deets__
Den .* auch vorne dran schreiben?

Re: Reguläre Ausdrücke

Verfasst: Montag 28. August 2017, 16:09
von grafnox
Ach, so einfach! Danke dir! :D

Re: Reguläre Ausdrücke

Verfasst: Montag 28. August 2017, 16:18
von BlackJack
@grafnox: Wobei mit regulären Ausdrücken hier schon ein wenig mit Kanonen auf Spatzen geschossen wird. Das würde ich mit der `partition()`-Methode auf Zeichenketten lösen:

Code: Alles auswählen

In [5]: s = 'P = 20%'

In [6]: s.partition('=')
Out[6]: ('P ', '=', ' 20%')

In [7]: key, equal, value = s.partition('=')

In [8]: if equal:
   ...:     print('key:', key)
   ...:     print('value:', value)
   ...: 
key: P
value:  20%

In [9]: 'some string without assignment'.partition('=')
Out[9]: ('some string without assignment', '', '')

In [10]: key, equal, value = 'some string without assignment'.partition('=')

In [11]: if equal:
    ...:     print('key:', key)
    ...:     print('value:', value)
    ...:

In [12]: 

Re: Reguläre Ausdrücke

Verfasst: Dienstag 29. August 2017, 12:09
von grafnox
BlackJack hat geschrieben:@grafnox: Wobei mit regulären Ausdrücken hier schon ein wenig mit Kanonen auf Spatzen geschossen wird. Das würde ich mit der `partition()`-Methode auf Zeichenketten lösen:

Code: Alles auswählen

In [5]: s = 'P = 20%'

In [6]: s.partition('=')
Out[6]: ('P ', '=', ' 20%')

In [7]: key, equal, value = s.partition('=')

In [8]: if equal:
   ...:     print('key:', key)
   ...:     print('value:', value)
   ...: 
key: P
value:  20%

In [9]: 'some string without assignment'.partition('=')
Out[9]: ('some string without assignment', '', '')

In [10]: key, equal, value = 'some string without assignment'.partition('=')

In [11]: if equal:
    ...:     print('key:', key)
    ...:     print('value:', value)
    ...:

In [12]: 
Du hast recht! Das ist viel besser. Danke dir! :)

Re: Reguläre Ausdrücke

Verfasst: Dienstag 29. August 2017, 15:44
von grafnox
Wie ist es eigentlich, wenn ich nach mehreren Sachen suche?
Ich bleibe dabei, dass ich alle Strings brauche, die das Zeichen '=' beinhalten, abgesehen davon suche ich auch Strings, welche mit dem Zeichen '#' anfangen.

Gruß

Re: Reguläre Ausdrücke

Verfasst: Dienstag 29. August 2017, 16:39
von Sirius3
@grafnox: kann es sein, dass Du eigentlich ini-Dateien lesen willst und nach dem ConfigParser-Modul suchst?

Re: Reguläre Ausdrücke

Verfasst: Mittwoch 30. August 2017, 08:42
von grafnox
Sirius3 hat geschrieben:@grafnox: kann es sein, dass Du eigentlich ini-Dateien lesen willst und nach dem ConfigParser-Modul suchst?
Ich lese eigentlich die Excel-Dateien. Ich muss hier leider die reguläre Ausdrücke verwenden, da ich mit Fließtexten arbeite.

Re: Reguläre Ausdrücke

Verfasst: Mittwoch 30. August 2017, 09:36
von Sirius3
@grafnox: das was Du bisher geschrieben hast, läßt mich weder an Excel-Dateien noch an Fließtext denken. Kannst Du hier den Inhalt einer Beispieldatei posten, so dass wir eine Idee von der Struktur der Datei bekommen?

Re: Reguläre Ausdrücke

Verfasst: Mittwoch 30. August 2017, 12:51
von grafnox
Sirius3 hat geschrieben:@grafnox: das was Du bisher geschrieben hast, läßt mich weder an Excel-Dateien noch an Fließtext denken. Kannst Du hier den Inhalt einer Beispieldatei posten, so dass wir eine Idee von der Struktur der Datei bekommen?
Danke für deine Hilfe! Leider kann ich hier keine Dateien posten, da es um meine Arbeit geht und ich die Geheimhaltungsvereinbarung unterschrieben habe. Um etwas voran zu kommen, ist es mir wichtig zu verstehen, wie ich über Modul "re" gleichzeitig nach mehreren Sachen suchen kann.
Beispielsweise re.findall(...). Das würde mir weiterhelfen :)

Re: Reguläre Ausdrücke

Verfasst: Mittwoch 30. August 2017, 13:13
von __deets__
Du darfst die Daten auch ruhig "anonymisieren". Aber so wird das nur ein unnoetiges Ratespiel, und klingt sehr nach einem X-Y-Problem.

Re: Reguläre Ausdrücke

Verfasst: Mittwoch 30. August 2017, 13:25
von grafnox
Ok, dann machen wir das so.
Ich habe eine Liste: s = ['#Blabla', '#BluBlu', 'A = 22', 'B = 11', 'C % 2', 'C-2']

Jetzt suche ich mir aus der Liste alle Elemente, welche mit # anfangen:

Code: Alles auswählen

for i in range(0, len(s)):
    print(re.findall('#.*', s[i]))
Ausgabe:
['#Blabla']
['#BluBlu']
[]
[]
[]
[]

Nun möchte ich alle Elemente, welche "="-Zeichen beinhalten:
for i in range(0, len(s)):
print(re.findall('.*=.*', s))

Ausgabe:
[]
[]
['A = 22']
['B = 11']
[]
[]

Meine Frage ist, wie kriege ich das in einem Schritt. Wie kann ich im re.findall(.....) gleichzeitig nach beiden Sachen suchen? Es muss doch meiner Meinung nach möglich sein. :)

Re: Reguläre Ausdrücke

Verfasst: Mittwoch 30. August 2017, 13:53
von Zizibee
@grafnox: Du kannst beide Suchkriterien mit 'oder' verknüpfen, dann gibt es einen Treffer wenn eines der Kriterien zutrifft. Unter Python habe ich das noch nicht versucht, in der Notepad++ Suche sähe das aber so aus:

Code: Alles auswählen

('#.*', s[i])|('.*=.*', s[i])

Re: Reguläre Ausdrücke

Verfasst: Mittwoch 30. August 2017, 14:04
von BlackJack
@grafnox: Diese Schleife ist „unpythonisch“. Man braucht sehr selten in Python tatsächlich die Indexwerte. Man kann direkt über die Elemente der Liste iterieren. Und `findall()` um jeweils *einen* Treffer zu finden, ist auch nicht so wirklich sinnvoll.

Re: Reguläre Ausdrücke

Verfasst: Mittwoch 30. August 2017, 14:10
von __deets__
Na warum testest du nicht einfach auf beides *in* der Schleife nacheinander?

Re: Reguläre Ausdrücke

Verfasst: Mittwoch 30. August 2017, 14:15
von grafnox
Es mag gut sein, dass die Schleifen "unpythonisch" sind. Dies bestreite ich ja auch nicht. Wie gesagt, ich bin noch ungeübt in Python, wie ich es auch am Anfang gesagt habe. Die Antwort von @Zizibee hat mir weiter geholfen. Ich danke euch trotzdem! :)

Re: Reguläre Ausdrücke

Verfasst: Mittwoch 30. August 2017, 14:19
von __deets__
Schoen zu hoeren, dass du uns *trotzdem* dankst. Vielleicht helfen wir dir ja auch in Zukunft trotzdem!

Re: Reguläre Ausdrücke

Verfasst: Mittwoch 30. August 2017, 14:57
von Sirius3
@grafnox: Deine regulären Ausdrücke machen etwas anderes als Du willst.

Hier brauchst Du auch gar keine regulären Ausdrücke:

Code: Alles auswählen

lines = ['#Blabla', '#BluBlu', 'A = 22', 'B = 11', 'C % 2', 'C-2']
for line in lines:
    if line.startswith('#'):
        print("Kommentar:", line)
    elif "=" in line:
        print("Schlüssel:", line)
    else:
        print("Sonstiges:", line)

Re: Reguläre Ausdrücke

Verfasst: Donnerstag 31. August 2017, 10:32
von grafnox
Sirius3 hat geschrieben:@grafnox: Deine regulären Ausdrücke machen etwas anderes als Du willst.

Hier brauchst Du auch gar keine regulären Ausdrücke:

Code: Alles auswählen

lines = ['#Blabla', '#BluBlu', 'A = 22', 'B = 11', 'C % 2', 'C-2']
for line in lines:
    if line.startswith('#'):
        print("Kommentar:", line)
    elif "=" in line:
        print("Schlüssel:", line)
    else:
        print("Sonstiges:", line)
Stimmt, da hast du recht! Da kann ich mir wirklich die Schleifen ersparen. Danke für den Tipp!
Eine andere Frage: Wie ist es mit dem Grad Celsius? Also wenn ich nach Elementen suche, die mit Grad Celsius enden? Er kann diesen Charakter gar nicht lesen. Habt ihr da vielleicht einen Tipp für mich?