用于匹配不是整数的浮点数的正则表达式

2024-05-14 16:41:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的正则表达式,我用它来查找字符串中的数字

-?\d*\.?\d+([eE][-+]?\d+)?

并希望对其进行修改,使其只匹配浮点数而不匹配整数。这一点的标准(据我所知)是匹配必须至少具有以下特征之一:.eE。然而,我想不出一个很好的方法来将这个需求合并到regex中而不复制主体的大部分。在

复制

经过一段时间的搜索,我发现了Regular expressions match floating point number but not integer,虽然没有明确的标题,但它完全是这个问题的复制品(包括soln)。在


Tags: 方法字符串标准match数字整数特征expressions
3条回答

下面是我的解决方案,使用lookahead允许'1e1',但不允许其他没有小数点的值:

>>> pattern = r'[+-]?(?:\d+\.\d*|\.\d+|\d+(?=[eE]))(?:[eE][+-]?\d+)?'
>>> re.match(pattern, '4.')
<_sre.SRE_Match object at 0x000000000347BD30>
>>> re.match(pattern, '4.4')
<_sre.SRE_Match object at 0x000000000347BCC8>
>>> re.match(pattern, '.4')
<_sre.SRE_Match object at 0x000000000347BD30>
>>> re.match(pattern, '4e4')
<_sre.SRE_Match object at 0x000000000347BCC8>

我想我应该

(-?\d*\.\d+([eE][-+]?\d+)?) | (-?\d+[eE][-+]?\d+)

第一部分与原始表达式相同,但需要句点。第二个捕捉不带句点的情况,需要[eE][-+]?\d+部分。在

下面的正则表达式可以做到这一点,尽管它有点神秘:

-?(?:\d+())?(?:\.\d*())?(?:e-?\d+())?(?:\2|\1\3)

说明:

一个数有三个部分(整数部分、小数部分和指数部分)。如果存在小数部分,则它是float,但如果它不存在,则当一个指数部分紧随其后时,该数字仍然可以是一个浮点数。在

这意味着我们首先必须在regex中使这三个部分都是可选的。但是,我们需要建立规则,精确地指定哪些部分需要在那里,以使一个有效的浮动。在

幸运的是,有一个技巧可以让我们做到这一点。空的捕获组(())总是匹配(空字符串)。对该组(\1)的反向引用只有在该组参与匹配时才会成功。通过在每个可选组中插入(),我们可以稍后测试所需的部分是否参与了匹配。在

例如,在Python中:

^{pr2}$

测试套件:

>>> [match.group(0) for match in
...        regex.finditer("1 1.1 .1 1. 1e1 1.04E-1 -.1 -1. e1 .1e1")]
['1.1', '.1', '1.', '1e1', '1.04E-1', '-.1', '-1.', '.1e1']

相关问题 更多 >

    热门问题