我正在尝试用科学记数法匹配数字(来自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'
。
答案 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)