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?
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']
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
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
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
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))