查找具有特定格式的数字

时间:2012-03-07 04:22:31

标签: python regex

我必须在文件中找到遵循特定格式的所有数字。格式如下:

每个数字都是正数或负数(符号可能存在​​也可能不存在,小数位前有一个或多个数字,小数点后有一个或多个数字)。可能没有小数位。每个数字前后都可以有空格。两个数字用逗号(,)或分号(;)或冒号(:)分隔。例如   (35.3,52.23; -623,623.62:-52,65)

所以在上面的例子中,我想列出六个数字。要搜索的数字列表在括号之间。到目前为止,我的代码看起来像这样:

def number_processing( file_location ):
    """"""

    import re

    file_variable = open( file_location )
    lines = file_variable.readlines()

    numbers = re.compile(r'[(] *[+]?[-]?[0-9][0-9]*[.]+[,]+[;]+[0-9][0-9]* *[)]')
    numbers_list = []

    for line in lines:
        for word in line.split(" "):
            match = numbers.match(word)
            if match:
                numbers_list.append(match.group())
      print numbers_list

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:6)

我认为您不需要使用str.split,仅使用re.findall怎么样?

>>> s = '35.3 , 52.23; -623, 623.62 : -52,65'
>>> re.findall(r'[-+]?\d+(?:\.\d*)?', s)
['35.3', '52.23', '-623', '623.62', '-52', '65']

编辑 只能在括号对内搜索,您可以先编写另一个正则表达式,然后重复使用上面的那个:

>>> s = '(23432.434 , 32423, -4343; 343) 5555 (3244, 45445; -4545 )'
>>> for s_ in re.findall(r'\(.*?\)', s):
...   re.findall(r'[-+]?\d+(?:\.\d*)?', s_)
... 
['23432.434', '32423', '-4343', '343']
['3244', '45445', '-4545']

要在列表理解中加入所有上述子列表:

>>> s = '(23432.434 , 32423, -4343; 343) 5555 (3244, 45445; -4545 )'
>>> pat1 = re.compile(r'\(.*?\)')
>>> pat2 = re.compile(r'[-+]?\d+(?:\.\d*)?')
>>> [x for s_ in re.findall(pat1, s) for x in re.findall(pat2, s_)]
['23432.434', '32423', '-4343', '343', '3244', '45445', '-4545']

答案 1 :(得分:0)

由于你已经按空间划分,正则表达式就像......

[(]?[+-]?\d+\.?\d+[,;:]?[)]?

(不确定你是否必须逃避括号......只需检查; D

[+] [ - ]? - 这是什么?你告诉你的正则表达式,+和 - 可能同时发生,但有可能一个或两个都不存在。

并且,整个正则表达式尝试同时识别两个单独的数字(如果我用逗号,分号和冒号得到你的意思),第二个就是整数。有很多测试用例,你不会得到你想要的东西。

答案 2 :(得分:0)

如果您只想使用正则表达式使用这些令牌,请运行全局表达式并以贪婪,简单的方式吃数字,短划线和小数点:

/[\d.-]+/

答案 3 :(得分:0)

如果您只是想找到所有数字,为什么不这样做:

re.findall(r'[+-\d.]', text)

并不担心无关的格式化?

(注意:这将匹配例如+2323.,这是奇怪的输入,但Python可以处理它。如果你这样做

map(float, re.findall(r'[+-\d.]', text))

你仍会得到漂亮的花车清单。)