在python中使用re.findall()的问题

时间:2015-02-12 00:56:26

标签: python regex

我正在尝试解析文本文件并从中提取某些整数。我的文本文件中的每一行都是这种格式:

a和b

其中a是整数,b可以是浮点数或整数

例如。 '4和10.2356'或'400和25'

我需要提取a和b。我正在尝试使用re.findall()来执行此操作:

print re.findall("\d+", txt)[0]  #extract a

#Extract b           
try:
    print float(re.findall("\d+.\d+", txt)[1])
except IndexError:
    print float(re.findall("\d+.\d+", txt)[0])

这里txt是文件中的一行。 try和except块的原因如下:

如果a是单个数字整数,例如。 4,代码的try部分只返回b。但是,如果a不是单个数字整数,例如。 400,代码的try部分返回a和b。我觉得这很奇怪。

但是,我不知道如何修改上面的代码来提取b是一个整数。我尝试了另一个尝试,除了bock在现有的except块之外,但它给了我奇怪的结果(在某些情况下a和b被连接)。请帮帮我。

此外,任何人都可以告诉我\ d +和\ d +。\ d +之间的区别以及为什么\ d +。\ d +返回400而不是4,即使两者都是整数。

1 个答案:

答案 0 :(得分:2)

将匹配为小数部分的模式设为可选。

>>> s = '4 and 10.2356'
>>> re.findall(r'\d+(?:\.\d+)?', s)
['4', '10.2356']
>>> print(int(re.findall(r'\d+(?:\.\d+)?', s)[0]))
4
>>> print(float(re.findall(r'\d+(?:\.\d+)?', s)[1]))
10.2356
  • \d+匹配一个或多个数字。
  • \d+.\d+匹配一个或多个数字加上任何单个字符加上一个或多个数字。
  • \d+\.\d+匹配一个或多个数字字符pus一个文字点加一个或多个数字。
  • \d+(?:\.\d+)?匹配整数和浮点数,因为我们将与小数部分匹配的模式作为可选项。捕获或非捕获组之后的?会将整个组转换为可选组。