我有这个简单的代码:
import re, sys
f = open('findallEX.txt', 'r')
lines = f.readlines()
match = re.findall('[A-Z]+', lines)
print match
我不知道为什么会收到错误:
'预期字符串或缓冲区'
有人可以帮忙吗?
答案 0 :(得分:30)
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']
答案 1 :(得分:6)
lines
是字符串列表,re.findall
不适用。尝试:
import re, sys
f = open('findallEX.txt', 'r')
lines = f.read()
match = re.findall('[A-Z]+', lines)
print match
答案 2 :(得分:4)
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
答案 3 :(得分:3)
'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
这可能对您有所帮助
答案 4 :(得分:0)
re.findall查找字符串中所有出现的正则表达式并返回列表。在这里,您使用的是字符串列表,需要使用此字符串才能使用re.findall
注意-如果正则表达式失败,则返回一个空列表。
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))