正则表达式匹配科学记数法

时间:2017-01-16 02:22:13

标签: python regex

我正在尝试用科学记数法匹配数字(来自here的正则表达式):

scinot = re.compile('[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)')
re.findall(scinot, 'x = 1e4')
['1e4']
re.findall(scinot, 'x = c1e4')
['1e4']

我希望它匹配x = 1e4但不匹配x = c1e4。我应该改变什么?

更新:答案here存在同样的问题:它错误地匹配'x = c1e4'

3 个答案:

答案 0 :(得分:3)

在正则表达式末尾添加锚点,在数字前添加替代空格或等号:

[\s=]+([+-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+))$

答案 1 :(得分:1)

只需添加[^\w]?即可排除第一位数字前面的所有字母数字字符:

 [+\-]?[^\w]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)

从技术上讲,\w也会排除数字字符,但这很好,因为你的正则表达式的其余部分都会捕获它。

如果您想要真正严谨,可以将\w替换为A-Za-z

 [+\-]?[^A-Za-z]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)

另一种偷偷摸摸的方式是在正则表达式的开头添加一个空格 - 这会强制所有匹配必须以空格开头。

答案 2 :(得分:0)

{{1}}

这个正则表达式可以帮助您在文本中找到所有科学记数法。

顺便说一下,这里是类似问题的链接: Extract scientific number from string