Python正则表达式匹配整数或浮点数且不分割浮点数
我正在尝试从一个文件中提取数据,这些数据可能是整数(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+)?)
这样做只会保存整个浮点数中的一个分组。