【问题标题】:Regex returns negative integers as positive [duplicate]正则表达式将负整数返回为正数[重复]
【发布时间】:2022-01-11 15:44:17
【问题描述】:

我正在报废一个网络并提取一些值,我只需要数字的一半。例如,如果字符串显示“-14.32 kcal/mole”,我想得到浮点数 -14.32

为此,我将应用以下代码:

import re

number_string = '-9.2 kcal/mole'


number = re.search(r"[-+]?\d*\.\d+|\d+", number_string).group()

print(number)

输出:-9.2

只要 number_string 是浮点数,它就可以正常工作。但是当数字是负整数时,我会得到该数字的正值。

例如,

import re

number_string = '-4 kcal/mole'


number = re.search(r"[-+]?\d*\.\d+|\d+", number_string).group()

print(number)

输出:4(而不是 -4)

【问题讨论】:

  • 通过非捕获组使小数部分可选,例如[-+]?\d+(?:\.\d+)?。我认为您甚至可以完全跳过交替。
  • 您的正则表达式是要么 一个符号,然后是一个带小数点的数字, 一个不带符号且不带小数点的数字。

标签: python regex integer negative-number


【解决方案1】:

| 是最低优先级的运算符。您正在寻找非零浮点数

[-+]?\d*\.\d+

或无符号整数

\d+

您需要将表达式括起来以匹配绝对值以使符号适用于:

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

或将小数部分设为可选。

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

在这两种情况下,我都使用了非捕获组来避免更改以下对 groups 方法的调用的语义。

【讨论】:

    【解决方案2】:

    我会使用这样的东西:

    [+-]?(?:\d*\.)?\d+
    
    • [+-]? - 可选的正号或负号
    • (?:\d*\.)? - 可选的前导数字后跟小数
    • \d+ - 必填数字

    https://regex101.com/r/WKPQ4h/1


    由于您正在抓取网页内容,因此此正则表达式将简单地查找所有数字。

    您可能希望针对特定的测量单位:

    [+-]?(?:\d*\.)?\d+(?= (?:kcal/mole|butterflies))
    

    https://regex101.com/r/FM5ZXJ/1

    【讨论】:

      【解决方案3】:

      您的正则表达式设置为搜索[-+]?\d*\.\d+\d+,这就是它发生的原因。您可以将正则表达式更改为 [-+]?\d*\.\d+|[-+]?\d+ 之类的内容,这应该会得到您的预期结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-02
        相关资源
        最近更新 更多