web-dev-qa-db-fra.com

TypeError: chaîne ou tampon attendu

J'ai ce code simple:

import re, sys

f = open('findallEX.txt', 'r')
lines = f.readlines()
match = re.findall('[A-Z]+', lines)
print match

Je ne sais pas pourquoi je reçois l'erreur:

'chaîne ou tampon attendu'

Quelqu'un peut-il aider?

41
user2290969

lines est une liste. re.findall() ne prend pas de liste.

>>> import re
>>> f = open('README.md', 'r')
>>> lines = f.readlines()
>>> match = re.findall('[A-Z]+', lines)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python2.7/re.py", line 177, in findall
    return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
>>> type(lines)
<type 'list'>

De help(file.readlines). C'est à dire. readlines() est pour les boucles/itération:

readlines(...)
    readlines([size]) -> list of strings, each a line from the file.

Pour trouver tous les caractères majuscules dans votre fichier:

>>> import re
>>> re.findall('[A-Z]+', open('README.md', 'r').read())
['S', 'E', 'A', 'P', 'S', 'I', 'R', 'C', 'I', 'A', 'P', 'O', 'G', 'P', 'P', 'T', 'V', 'W', 'V', 'D', 'A', 'L', 'U', 'O', 'I', 'L', 'P', 'A', 'D', 'V', 'S', 'M', 'S', 'L', 'I', 'D', 'V', 'S', 'M', 'A', 'P', 'T', 'P', 'Y', 'C', 'M', 'V', 'Y', 'C', 'M', 'R', 'R', 'B', 'P', 'M', 'L', 'F', 'D', 'W', 'V', 'C', 'X', 'S']
31
timss

lines est une liste de chaînes, re.findall ne fonctionne pas avec ça. essayer:

import re, sys

f = open('findallEX.txt', 'r')
lines = f.read()
match = re.findall('[A-Z]+', lines)
print match
7
mata

readlines() retournera une liste de toutes les lignes du fichier, donc lines est une liste. Vous voulez probablement quelque chose comme ça:

for line in f.readlines(): # Iterates through every line and looks for a match
#or
#for line in f:
    match = re.findall('[A-Z]+', line)
    print match

Ou, si le fichier n'est pas trop volumineux, vous pouvez le saisir sous forme de chaîne unique:

lines = f.read() # Warning: reads the FULL FILE into memory. This can be bad.
match = re.findall('[A-Z]+', lines)
print match
4
thegrinner

Le terme "lignes" de votre extrait de code consiste en un ensemble de chaînes.

 lines = f.readlines()
 match = re.findall('[A-Z]+', lines)

Vous ne pouvez pas envoyer de lignes entières dans la re.findall('pattern',<string>)

Vous pouvez essayer d'envoyer ligne par ligne

 for i in lines:
  match = re.findall('[A-Z]+', i)
  print match

ou pour convertir la collection complète de lignes en une seule ligne (chaque ligne séparée par un espace)

 NEW_LIST=' '.join(lines)
 match=re.findall('[A-Z]+' ,NEW_LIST)
 print match

Cela pourrait vous aider

3

re.findall trouve toutes les occurrences de l'expression rationnelle dans une chaîne et revient dans une liste. Ici, vous utilisez une liste de chaînes, vous en avez besoin pour utiliser re.findall

Remarque - Si la regex échoue, une liste vide est renvoyée.

import re, sys

f = open('picklee', 'r')
lines = f.readlines()  
regex = re.compile(r'[A-Z]+')
for line in lines:
     print (re.findall(regex, line))
0
Sumanyu Nandwani