我的目标是使用正则表达式编写一个程序,该程序可读取文本文件,然后提取数字(以字符串形式,然后转换为整数),但是我显然缺少此代码的一些关键要素。这是我到目前为止的内容:
Traceback (most recent call last):
File "regexnumbers.py", line 8, in <module>
y = re.findall('[0-9]+',handle)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 181, in findall
return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
它返回
\b(?:[0-4]|[6-9])+\b
说实话,对于初学者来说,这对我来说意义不大!
答案 0 :(得分:1)
您应该将字符串或缓冲区传递给re.findall
,但要传递文件对象– handle
,因此会出错。
您可以使用文件对象上的read()
方法一次读取所有文件:
re.findall('[0-9]+',handle.read())
但是,如果文件很大,则更好的方法是逐行读取文件(因为文件对象是迭代器),并使用生成器表达式(或列表推导)来引用结果:
matches = (re.findall('[0-9]+', line) for line in handle)
,然后您可以使用itertools.chain
加入比赛迭代器:
itertools.chain.from_iterable(matches)
itertools.chain(*matches)
调用list
可以得到列表结果:
list(itertools.chain.from_iterable(matches))
如果您需要对结果进行简单的迭代,则无需转换为列表。
现在,在操作之后,您需要关闭文件对象以确保其所引用的文件描述符已正确关闭并释放了资源:
handle.close()
但是更好的习惯用法方式是使用上下文管理器来为您自动关闭:
with open('file.txt') as handle:
matches = list(itertools.chain.from_iterable(re.findall('[0-9]+', line) for line in handle))
答案 1 :(得分:0)
有很多事情你没有做最好的方法,但是从本质上讲,可以归结为:
要读取文件,最好的结构是:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.3/jquery.min.js"></script>
<div id = "fullTable">
<div class = "row" id="row">
test
<button type="button" onclick="deleteRow(this)">-</button>
<button type="button" onclick="duplicateRow()">+</button>
</div>
</div>
这会将文件的内容读入列表(如果需要的话,请使用数组),重要的是,随着段落的结束,将关闭文件。然后,您可以遍历行(每一行作为一个列表项)并在每行上执行regex语句。
您的代码的问题是您正在将一个对象(文件处理程序本身)传递给re模块。因此,TypeError