2015-02-12 64 views
1

我试图解析一个文本文件并从中提取某些整数。在我的文本文件中的每一行都是这样的格式:在Python中使用re.findall()的问题

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是从文件中的单行。尝试和除了块的原因如下:

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

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

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

回答

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+)?匹配整数以及浮点数,因为我们将匹配小数部分的模式设置为可选。 ?之后捕获或不捕获组会将整个组转换为可选组。
+0

非常感谢! – foobar 2015-02-12 23:55:34