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ß
Reguläre Ausdrücke
@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!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]:

Think twice, code once!
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ß
Ich bleibe dabei, dass ich alle Strings brauche, die das Zeichen '=' beinhalten, abgesehen davon suche ich auch Strings, welche mit dem Zeichen '#' anfangen.
Gruß
Think twice, code once!
Ich lese eigentlich die Excel-Dateien. Ich muss hier leider die reguläre Ausdrücke verwenden, da ich mit Fließtexten arbeite.Sirius3 hat geschrieben:@grafnox: kann es sein, dass Du eigentlich ini-Dateien lesen willst und nach dem ConfigParser-Modul suchst?
Think twice, code once!
@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.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?
Beispielsweise re.findall(...). Das würde mir weiterhelfen

Think twice, code once!
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:
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.
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]))
['#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.

Zuletzt geändert von Anonymous am Mittwoch 30. August 2017, 14:02, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Think twice, code once!
@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])
@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.
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! 

Think twice, code once!
@grafnox: Deine regulären Ausdrücke machen etwas anderes als Du willst.
Hier brauchst Du auch gar keine regulären Ausdrücke:
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!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)
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?
Think twice, code once!