📜  从列中的数字中去除符号 (1)

📅  最后修改于: 2023-12-03 15:36:16.411000             🧑  作者: Mango

从列中的数字中去除符号

在编程过程中,我们往往需要对数字进行操作,但有时这些数字可能被附加了符号(如正负号、小数点等),这时候我们需要把这些符号去除,以便更好的进行运算或处理。

方法一:使用正则表达式

正则表达式是处理字符串的利器,通过使用正则表达式,我们可以方便地将数字中的符号进行替换或去除。

import re

# 去除正负号
pattern = re.compile(r'[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?')
test_str = "123.456-789"
result = pattern.findall(test_str)
print(result)

输出:

[('123.456', '', ''), ('-789', '', '')]

这里使用了正则表达式 [+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?,它能够匹配例如 -123.456e+789 这样的复杂数字,这个正则表达式的意思是:

  • [+-]? 匹配可选的正负号
  • (\d+(\.\d*)?|\.\d+) 匹配数值部分,可以是整数或小数
  • ([eE][+-]?\d+)? 匹配科学计数法表示的部分,如 e+789、E-789

这个正则表达式使用了分组,在 findall() 方法中,只有第一个分组中的内容会被返回,这正好是我们需要的数值部分。

当然,如果你只需要去除正负号,也可以使用更简单的正则表达式 [-+]?[\d\.]+。其中:

  • [-+]? 匹配可选的正负号
  • [\d\.]+ 匹配数字和小数点

这个正则表达式中没有考虑科学计数法的情况,如果需要可以在后面加上 ([eE][+-]?\d+)? 以匹配。

方法二:手动去除符号

手动去除符号的方法相对来说比较简单,我们可以遍历数值字符串,把其中的符号去除。

def remove_symbol(num_str):
    if not num_str:
        return num_str
    
    if num_str[0] in ("+", "-"):
        num_str = num_str[1:]      # 去除正负号
    
    num_list = list(num_str)
    while "." in num_list:
        num_list.remove(".")      # 去除小数点
    
    return "".join(num_list)

这个函数首先判断了数字字符串是否为空,然后去除了正负号,最后遍历列表把其中的小数点去除。

值得一提的是,如果你所处理的数值比较大,每个数值字符串都需要手动遍历,也许会比较耗时,此时你可以使用 Numpy 库里的 numpy.core.defchararray.replace() 函数,它可以快速地替换字符。

总结

无论是使用正则表达式还是手动去除符号,我们都可以方便地去除数字中的符号,以便更好地进行后续操作。