Подтвердить что ты не робот

TypeError: ожидаемая строка или буфер

У меня есть этот простой код:

import re, sys

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

Я не знаю, почему я получаю сообщение об ошибке:

'ожидаемая строка или буфер

Может ли кто-нибудь помочь?

4b9b3361

Ответ 1

lines - это список. re.findall() не принимает списки.

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

От help(file.readlines). То есть readlines() для циклов/итераций:

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

Чтобы найти все символы верхнего регистра в вашем файле:

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

Ответ 2

lines - список строк, re.findall не работает с этим. попробуйте:

import re, sys

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

Ответ 3

readlines() вернет список всех строк в файле, поэтому lines - это список. Вероятно, вы хотите что-то вроде этого:

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

Или, если файл не слишком велик, вы можете захватить его как одну строку:

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

Ответ 4

'lines' термин из вашего фрагмента состоит из набора строк.

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

Вы не можете отправить целые строки в re.findall('pattern',<string>)

Вы можете попробовать отправить строку за строкой

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

или для преобразования всей коллекции строк в одну строку (каждая строка разделена пробелом)

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

Это может помочь вам