TypeError: chaîne attendue ou tampon avec le feu.match et matchObj.groupe()

Je reçois l'erreur:

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 
  1. line doit utiliser line.strip de lire chaque ligne du fichier

  2. re.match utilise une expression régulière pour rechercher les matches à 3 groupes (players, hits, atBats) dans la chaîne

  3. matchObj.group() devrait lire chaque groupe et de mettre les stats où ils vont playerStats{} dictionnaire

Comment puis-je obtenir ré.match d'attribuer un type à la matchObj donc je peux tirer avec un groupe() et ajouter à 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, non, ce n'est pas la façon dont vous utilisez re.match. La façon dont vous l'avez écrit, vous êtes à la recherche pour votre expression régulière dans la chaîne littérale "ligne", et non pas dans la variable line. Depuis la chaîne ne correspond pas à la re, puis re.match() retourne Aucun, d'où l'erreur. Vérifiez ici: tutorialspoint.com/python/python_reg_expressions.htm
  • J'ai édité au dessus, j'ai d'abord eu comme ligne de pas "en ligne" mais je reçois le message d'erreur qui est maintenant collé en haut quand vous le faites. Est ligne, pas une chaîne de caractères après aide de la ligne.la bande?