如何仅从输入文件中提取数字。数字可以是float / int

时间:2014-11-09 03:26:06

标签: python regex

我想从文件中提取数字(整数和浮点数)(不包括所有特殊符号和字母)。所有职位的数字。

import re
file = open('input_file.txt', 'r')
file = file.readlines()

for line in file:
    line=re.findall(r'\d+|\d+.\d+', line)
    print line

3 个答案:

答案 0 :(得分:4)

也许这会有所帮助。

此处的string可以是您的line。我只是输入了虚拟文本。

import re

string = "He is 100, I am 18.5 and we are 0.67. Maybe we should 100, 200, and 200b 200, 67.88"

s = re.findall(r"[-+]?\d*\.\d+|\d+", string)

print(s)

执行时吐出以下内容:

['100', '18.5', '0.67', '100', '200', '200', '200', '67.88']

<强>实验

我对弗兰肯斯坦的部分语料库进行了一些小实验。

注意我使用.read()来读取整个文件而不是逐行处理。

import re

file = open('frank.txt', 'r')

file = file.read()

numbers = re.findall(r"[-+]?\d*\.\d+|\d+", file)

print(numbers)

这是结果:

['17', '2008', '84', '1', '11', '17', '2', '28', '17', '3', '7', '17', '4', '5', '17', '31', '13', '17', '19', '17', '1', '2', '3', '4', '5', '6', '18', '17', '7', '7', '12', '17', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '27', '20', '21', '22', '18', '17', '23', '24', '26', '17', '2', '5', '7', '12', '9', '11', '84', '84', '8', '84', '1', '1', '1', '.8', '1', '1', '1', '1', '1', '1', '1', '.1', '1', '.2', '1', '.1', '1', '.7', '1', '.8', '1', '.9', '1', '.3', '1', '.1', '1', '.7', '1', '.4', '1', '.5', '1', '.1', '1', '.6', '1', '.1', '1', '.7', '1', '.8', '1', '.9', '1', '.8', '20', '60', '4', '30', '1', '.3', '90', '1', '.9', '3', '1', '1', '.1', '1', '.2', '1', '.3', '3', '1', '.3', '90', '1', '.4', '1', '.3', '1', '.5', '1', '.6', '2', '2001', '3', '4', '3', '501', '3', '64', '6221541', '501', '3', '4557', '99712', '809', '1500', '84116', '801', '596', '1887', '4', '1', '5', '000', '50', '5']

单元测试

我写了一个更轻的版本,可以使用你提供的字符串。

import unittest
import re


# Extract numbers improved
def extract_numbers_improved(x):

    numbers = re.findall(r"[-+]?\d*\.\d+|\d+", x)

    return numbers


# Unit Test
class Test(unittest.TestCase):
    def testcase(self):

        teststr = "12asdasdsa 33asdsad 44 aidsasdd 2231%#@ qqq55 2222ww ww qq 1asdasd 33##$11 42.09 12$"
        self.assertEqual(extract_numbers_improved(\
            teststr), ['12', '33', '44', '2231', '55', '2222', '1', '33', '11', '42.09', '12'])

unittest.main()

当事情通过时,会发出绿色信号,如下所示:

Ran 1 test in 0.000s

OK

答案 1 :(得分:3)

如果不澄清,您可以尝试以下方法。

re.findall(r'[+-]?\d+(?:\.\d+)?', line)

答案 2 :(得分:1)

re.findall("[+-]?\d+\.?\d*",some_text)

我认为至少

[+-]?零或一个+或 - (即可选)

\d+一个或多个数字

\.?可选的小数

\d*零个或多个额外数字