it-swarm.com.de

TypeError: erwarteter String oder Puffer

Ich habe diesen einfachen Code:

import re, sys

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

Ich weiß nicht, warum ich den Fehler erhalte:

'erwarteter String oder Puffer'

Kann jemand helfen?

41
user2290969

lines ist eine Liste. re.findall() nimmt keine Listen an.

>>> 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'>

Von help(file.readlines). Das heißt readlines() ist für Schleifen/Iteration:

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

So finden Sie alle Großbuchstaben in Ihrer Datei:

>>> 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 ist eine Liste von Zeichenfolgen, re.findall funktioniert damit nicht. Versuchen:

import re, sys

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

readlines() gibt eine Liste aller Zeilen in der Datei zurück, also ist lines eine Liste. Sie möchten wahrscheinlich so etwas:

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

Wenn die Datei nicht zu groß ist, können Sie sie auch als einzelne Zeichenfolge erfassen:

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

Der Begriff "Zeilen" in Ihrem Snippet besteht aus einer Reihe von Zeichenfolgen.

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

Sie können nicht ganze Zeilen an die Funktion re.findall('pattern',<string>) senden.

Sie können versuchen, Zeile für Zeile zu senden

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

oder die gesamte Zeilensammlung in eine einzelne Zeile umwandeln (jede Zeile durch Leerzeichen getrennt)

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

Das könnte dir helfen

3

re.findall findet alle regulären Ausdrücke in einer Zeichenfolge und gibt sie in einer Liste zurück. Hier verwenden Sie eine Liste von Zeichenfolgen, die Sie für die Verwendung von re.findall benötigen

Hinweis - Wenn der reguläre Ausdruck fehlschlägt, wird eine leere Liste zurückgegeben.

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