我正在尝试解析文本文件并从中提取某些整数。我的文本文件中的每一行都是这种格式:
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,即使两者都是整数。
答案 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+)?
匹配整数和浮点数,因为我们将与小数部分匹配的模式作为可选项。捕获或非捕获组之后的?
会将整个组转换为可选组。