gpt4 book ai didi

python - 尝试从文本数据中提取数字,但 re.findall() 找不到任何内容

转载 作者:行者123 更新时间:2023-12-01 08:26:33 31 4
gpt4 key购买 nike

我的目标是使用正则表达式编写一个程序,该程序读取文本文件,并提取数字(作为字符串,然后转换为整数),但我显然缺少此代码的一些关键元素。这是我到目前为止所拥有的:

import re

#read the file
name = input('Input file name:')
handle = open(name)

#look for integers usings re.findall() / '[0-9]+'
y = re.findall('[0-9]+',handle)
print(y)

它返回

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

说实话,这对我这个初学者开发者来说没有多大意义!

最佳答案

您应该将字符串或缓冲区传递给 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))

关于python - 尝试从文本数据中提取数字,但 re.findall() 找不到任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54200037/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com