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

Posted

技术标签:

【中文标题】用于浮点数或 int 的 Python 正则表达式,而不是将浮点数分成两个浮点数【英文标题】:Python regex for float or int while not splitting the float into two floats 【发布时间】:2014-09-29 23:14:34 【问题描述】:

我正在尝试从可以是 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.948126.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', '')]
>>>

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

如何格式化我的正则表达式,使其捕获浮点数并返回该浮点数,或者捕获一个整数并返回该整数。

【问题讨论】:

【参考方案1】:

您正在使用(\d+(\.\d+)?) 捕获并保存两个分组

试试这个:

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

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

【讨论】:

这也将匹配来自(tstamp 53D2B530)) 的号码。括号检查在哪里? @user3218114:这只是对匹配单个数字的部分的调整。如果你将它插入到完整的正则表达式中,它匹配 两个 由空格分隔的数字,它可以正常工作。 就是这样!非常感谢@celeritas【参考方案2】:

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

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

不确定您使用的是 findall 的事实,但这会找到 1 个或多个数字后跟 . 后跟 1 个或多个数字“或”(由 | 表示)一个或多个数字,所以要么浮点数或整数

【讨论】:

你能解释一下为什么这是解决方案吗? re.findall("\d+\.\d+|\d+",line) 解释:\d+表示查找1位或多位数字(0-9),\.是转义.,否则视为通配符,@987654329 @ 表示逻辑或。因此,知道这 3 件事后,您可以看到它是 1 个或多个数字后跟 1 个或多个数字或 1 个或多个数字。

以上是关于用于浮点数或 int 的 Python 正则表达式,而不是将浮点数分成两个浮点数的主要内容,如果未能解决你的问题,请参考以下文章

Perl正则表达式提取浮点数

关于浮点数的正则表达式?

Python输入验证 - 接受正浮点数或int

Python常用正则表达式总结

从字符串创建浮点数

正则表达式从逗号分隔列表中删除连续重复(整数和/或浮点数)