正则表达式仅包含“-”和“。”的首次匹配。

时间:2019-06-03 13:29:05

标签: python regex floating-point data-cleaning

我有以下正则表达式\.(?![^.]+$)|[^-0-9.],它清除数字中的所有字符,并仅保留第一个'。 (因此最后匹配),因为它可以是浮点数。但是,某些数字也可以是负数和/或在其中包含“-”,如下所示:

-1.06581.4e-14

我如何才能使已经拥有的正则表达式也仅匹配上一次遇到的负号? 我的最终号码必须像这样:

-1.06581414

2 个答案:

答案 0 :(得分:1)

如果我们希望用科学数字替换.e,则此表达式可能会这样做,因为我不确定其他输入,所以我添加了几个可选的边界:

([-+]?\d+)(\.\d+)?((\.)(\d+)(e)([-+])(\d+))?

它有8个捕获组,所有隔室的编号都是科学编号,如有必要,我们可以简化它。

Demo

测试

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"([-+]?\d+)(\.\d+)?((\.)(\d+)(e)([-+])(\d+))?"

test_str = ("-1.06581.4e-14\n"
    "1.06581.4e-14\n"
    "1.06581.4e+14\n"
    "+1.06581.4e-14\n"
    "+1.06581\n"
    "1.06\n"
    "1")

subst = "\\1\\2\\5\\8"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

enter image description here

RegEx电路

jex.im可视化正则表达式:

enter image description here

演示

此代码段仅显示捕获组的工作方式:

const regex = /([-+]?\d+)(\.\d+)?((\.)(\d+)(e)([-+])(\d+))?/gm;
const str = `-1.06581.4e-14
1.06581.4e-14
1.06581.4e+14
+1.06581.4e-14
+1.06581
1.06
1`;
const subst = `$1$2$5$8`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log(result);

答案 1 :(得分:0)

如果要保留模式并希望匹配最后一个连字符,则可以添加另一个替换|来匹配连字符,并使用负前瞻(?!.*-)断言后面不是连字符。 :

\.(?![^.]+$)|[^-0-9.]|-(?!.*-)

查看regex demo