用于float或int的Python正则表达式,而不将float分割为两个浮点数

时间:2014-08-06 21:06:45

标签: python regex

我正在尝试从可以是int或float的文件中提取数据。我发现这个正则表达式将从文件(\d+(\.\d+)?)中提取这两种类型,但我遇到的问题是它将浮点数分成两个。

>>> import re
>>> line = "(gr_line (start 218.948 126.111) (end 218.948 143.637) (angle 90) (layer Edge.Cuts) (width 0.1) (tstamp 53D2B530))"
>>>
>>> print re.findall(r'\(start (\d+(\.\d+)?) (\d+(\.\d+)?)\)', line)
[('218.948', '.948', '126.111', '.111')]
>>>

这样做的目的是获得由(start n n)定义的起始坐标,但正如您所看到的,它取218.948并将其分为218.948.948。与126.111相同的问题。

如果输入字符串在起始括号中有一个int,我会得到以下内容:

>>> line = "(gr_line (start 218.948 126) (end 218.948 143.637) (angle 90) (layer Edge.Cuts) (width 0.1) (tstamp 53D2B530))"
>>> print re.findall(r'\(start (\d+(\.\d+)?) (\d+(\.\d+)?)\)', line)
[('218.948', '.948', '126', '')]
>>>

这里的问题是添加的空索引 - 不是一个大问题,但有点不方便。

我如何格式化我的正则表达式,以便它捕获浮点数并返回该浮点数,或者返回一个int并返回该int。

2 个答案:

答案 0 :(得分:4)

您正在使用(\d+(\.\d+)?)

捕获并保存两个分组

试试这个:

(\d+(?:\.\d+)?)

这只会保存整个浮动的分组。

答案 1 :(得分:0)

print re.findall("\d+\.\d+|(?<=angle\s)\d+", line)

['218.948', '126.111', '218.948', '143.637', '90', '0.1']

不确定您使用的是findall但是这会找到一个或多个数字后跟一个.后跟一个或多个数字&#34;或&#34; (由|表示)一个或多个数字,因此浮点数或整数