Python正则表达式匹配整数或浮点数且不分割浮点数

7 投票
2 回答
11265 浏览
提问于 2025-04-18 16:18

我正在尝试从一个文件中提取数据,这些数据可能是整数(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 也有同样的问题。

如果输入字符串在起始括号中是一个整数,我得到的结果是:

>>> 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', '')]
>>>

这里的问题是多了一个空的索引——这不是个大问题,但确实有点麻烦。

我该如何调整我的正则表达式,以便能够捕获小数并返回这个小数,或者捕获整数并返回这个整数呢?

2 个回答

1

这段代码的意思是用来从一行文字中找出一些数字。具体来说,它会找出这样的数字:一串数字后面跟着一个小数点,再后面还有一串数字(也就是小数),或者只是一串数字(也就是整数)。

在代码中,print re.findall("\d+\.\d+|(?<=angle\s)\d+", line) 这个部分就是在做这个工作。它会返回一个列表,里面包含了所有找到的数字。

比如,运行这段代码后,得到的结果是 ['218.948', '126.111', '218.948', '143.637', '90', '0.1'],这表示在那一行文字中找到了这些数字:218.948、126.111、218.948、143.637、90 和 0.1。

总之,这段代码就是用来提取文本中的数字,无论是小数还是整数。

17

你正在用 (\d+(\.\d+)?) 来捕捉和保存两个分组。

试试这个:

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

这样做只会保存整个浮点数中的一个分组。

撰写回答