首页 > 解决方案 > 在 Python 上使用正则表达式查找表达式中的任何数值

问题描述

我正在尝试从表达式中获取所有数值(整数、小数、浮点数、科学记数法),并希望将它们与不是实数而是名称一部分的数字区分开来。例如在下面的表达式中。

230FIC000.PV>=-2e3 211FIC00.PV <= 20 100fic>-20.4 tic200 >=45 tic100 <-2E-4 fic123 >1 

第一个 230 不是数值,因为它是标签 (230FIC100.PV) 的一部分。

使用网络工具regexp.com,我想出了适用于上述表达式的以下表达式。

(?!\s)(?<!\w)[+-]?((\d+\.\d*)|(\.\d+)|(\d+))([eE][+-]?\d+)?(\s)|(?<!\w)[0-9]\d+(?<!\s)$

但是,当我尝试在 python re.findall() 中使用上述表达式时,我收到一个包含 5 个元组的列表,每个元组有 6 个元素。

import re
pat = r'(?!\s)(?<!\w)[+-]?((\d+\.\d*)|(\.\d+)|(\d+))([eE][+-]?\d+)?(\s)|(?<!\w)[0-9]\d+(?<!\s)$'
exp = '230FIC000.PV>=-2e3 211FIC00.PV <= 20 100fic>-20.4 tic200 >=45 tic100 <-2E-4 fic123 >1 '
matches = re.findall(pat,exp)

结果是

special variables
function variables
0:('2', '', '', '2', 'e3', ' ')
1:('20', '', '', '20', '', ' ')
2:('20.4', '20.4', '', '', '', ' ')
3:('45', '', '', '45', '', ' ')
4:('2', '', '', '2', 'e4', ' ')
len():5

我想要一些帮助来了解正在发生的事情,以及是否有任何方法可以以与 regexp.com 上发生的类似方式完成此操作。

标签: pythonregex

解决方案


这应该照顾它。(所有项目都是字符串)

import re

st = '230FIC000.PV>=-2e3 211FIC00.PV <= 20 100fic>-20.4 tic200 >=45 tic100 <-2E-4 fic123 >1'

re.findall(r'-?[0-9]+\.?[0-9]*(?:[Ee]\ *-?\ *[0-9]+)|-?\d+\.\d+|\b\d+\b', st)

参考:如何从字符串中提取数字

从字符串中提取科学数字

从字符串中提取十进制值


推荐阅读