4 Stimmen

Nummern abgleichen, wenn die Zeile mit einem Schlüsselwort beginnt

Ich habe eine Datei, die wie folgt aussieht:

foo: 11.00 12.00  bar 13.00
bar: 11.00 12.00 bar
foo: 11.00 12.00

und möchte alle Zahlen in Zeilen extrahieren, die mit dem Schlüsselwort "foo:" beginnen. Erwartetes Ergebnis:

['11.00', '12.00', '13.00']
['11.00', '12.00']

Das ist einfach, wenn ich zwei Regexe verwende, etwa so:

    if re.match('^foo:', line):
        re.findall('\d+\.\d+', line)

aber ich habe mich gefragt, ob es möglich ist, diese in einer einzigen Regex zu kombinieren?

Vielen Dank für Ihre Hilfe, MD

4voto

egor83 Punkte 1144

Nicht genau das, was Sie gefragt haben, aber da es empfohlen wird, Standard-Python-Tools anstelle von Regexen zu verwenden, wenn möglich, würde ich so etwas wie diese tun:

import re

with open('numbers.txt', 'r') as f:
    [re.findall(r'\d+\.\d+', line) for line in f if line.startswith('foo')]

UPDATE

Und dies wird die Zahlen nach "foo" zurückgeben, auch wenn es irgendwo in der Zeichenkette und nicht nur am Anfang steht:

with open('numbers.txt', 'r') as f:
    [re.findall(r'\d+\.\d+', line.partition('foo')[2]) for line in f]

0voto

Some programmer dude Punkte 377919

Wenn alle Zeilen in der Datei immer die gleiche Anzahl von Zahlen haben, können Sie die folgende Regex verwenden:

"^foo:[^\d]*(\d*\.\d*)[^\d]*(\d*\.\d*)[^\d]*(\d*\.\d*)"

Beispiel:

>>> import re
>>> line = "foo: 11.00 12.00 bar 13.00"
>>> re.match("^foo:[^\d]*(\d*\.\d*)[^\d]*(\d*\.\d*)[^\d]*(\d*\.\d*)", line).groups()
('11.00', '12.00', '13.00')
>>> 

Die Verwendung von Klammern um einen Teil des regulären Ausdrucks macht diesen zu einer Gruppe, die aus dem Match-Objekt extrahiert werden kann. Weitere Informationen finden Sie in der Python-Dokumentation.

0voto

Austin Marshall Punkte 2913

Sie können auf den ersten regexp verzichten und stattdessen Zeilen in einem Listenverständnis filtern, indem Sie die ersten vier Zeichen der Zeile vergleichen, und den inneren regexp kompilieren:

import re

with open("input.txt", "r") as inp:
    prog=re.compile("\d+\.\d+")
    results=[prog.findall(line) for line in inp if line[:4]=="foo:"]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X