TypeError: expected string oder buffer mit re.Spiel und matchObj.Gruppe()
Ich erhalte die Fehlermeldung:
Traceback (most recent call last):
File "ba.py", line 13, in <module>
matchObj = re.match(r"^(\w+ \w+) batted (\d+) times with (\d+) hits and (\d+) runs", line)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 137, in match
return _compile(pattern, flags).match(string)
TypeError: expected string or buffer
-
line
verwenden solltenline.strip
zu Lesen, jede Zeile in der Datei -
re.match
regex verwendet, um zu schauen, Spiele zu 3 Gruppen (players
,hits
,atBats
) in der Zeichenfolge -
matchObj.group()
sollten, Lesen Sie jede Gruppe und legen die Statistiken, wo Sie gehen inplayerStats{}
Wörterbuch
Wie bekomme ich re.match-Attribut einen Typ, der matchObj, damit ich ziehen kann, mit group() und fügen Sie zu playerStats()?
import re, sys, os
if len(sys.argv) < 2:
sys.exit("Usage: %s filename" % sys.argv[0])
filename = sys.argv[1]
if not os.path.exists(filename):
sys.exit("Error: File '%s' not found" % sys.argv[1])
playerStats = {'players': (0, 0, 0)}
matchObj = re.match(r"^(\w+ \w+) batted (\d+) times with (\d+) hits and (\d+) runs", line)
with open(filename) as f:
for line in f:
line = line.strip()
if player in playerStats:
playerStats[players][0] += atBat
playerStats[players][1] += hit
if player not in players:
player = matchObj.group(1)
playerStats[players][0] = atBat
playerStats[players][1] = hit
avgs = 0
else:
playerStats[players] = player
playerStats[players][0] = atBat
playerStats[players][1] = hit
playerStats[players][2] = 0
try:
player = matchObj.group(1)
atBat = matchObj.group(2)
hit = matchObj.group(3)
except AttributeError as ae:
print str(ae), "\skipping line:", line
except IndexError as ie:
print str(ie), "\skipping line:", line
#calculates averages
for players in playerStats:
avgs[player] = round(float(hits[player])/float(atBats[player]), 3)
print "%s: %.3f" % (player, avgs[player])
Hmm, Nein, das ist nicht, wie Sie verwenden
Ich editiert oben, ursprünglich hatte ich es als Linie, nicht die "Linie" aber ich bekomme die Fehlermeldung, dass das jetzt eingefügt, an der Spitze dabei. Ist die Zeile nicht um einen string nach Zeilen.Streifen?
re.match
. Die Art und Weise Sie es geschrieben, Sie sind auf der Suche nach Ihren regulären Ausdruck in das Zeichenfolgenliteral "Linie", nicht in der variable line
. Da die Zeichenfolge nicht mit der re, dann re.match() gibt Keine, daher der Fehler. Prüfen Sie hier: tutorialspoint.com/python/python_reg_expressions.htmIch editiert oben, ursprünglich hatte ich es als Linie, nicht die "Linie" aber ich bekomme die Fehlermeldung, dass das jetzt eingefügt, an der Spitze dabei. Ist die Zeile nicht um einen string nach Zeilen.Streifen?
InformationsquelleAutor Virge Assault | 2014-10-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du liest die gesamte Datei in Zeile. Sie erhalten diese Fehlermeldung, da die Linie ist eine Liste und kein string oder buffer. Wenn Sie die Schleife durch jede Zeile legen Sie Ihre Streifen innerhalb der for-Schleife. Beispiel unten, um Ihnen helfen, begonnen.
Auch, es sei denn, Sie zeigen Beispiel Daten, die form Ihrer Textdatei kann ich nicht sagen, ob deine regex korrekt ist.
Update:
Hier ist eine funktionierende version basierend auf Ihre Kommentare und update. Fühlen Sie sich frei zu ändern, wie Sie benötigen:
Inhalt in.txt:
Ausgabe:
code
für Spieler in der playerStats:code
. Ich bin nicht super vertraut mit versuchen: und ich bin mir nicht sicher, ob seine Probleme verursacht, tun Sie sehen, dass etwas falsch?Sie brauchen außer block nach try-block. Können Sie aktualisieren Sie Ihre Frage mit dem neuen code?
Aktualisiert. Gibt mir einen syntax-Fehler (Karotte unter das t im ersten "Ausnahme").
InformationsquelleAutor user3885927