Python 正则表达式匹配数字

Python 正则表达式匹配数字

正则表达式是一种强大的文本处理工具,在 Python 中也得到了广泛的应用。本文将介绍如何使用 Python 正则表达式来匹配数字,对数字的不同格式进行匹配、提取和转换。

匹配整数和浮点数

Python 的 re 模块提供了 re.match() 和 re.search() 两种函数来进行正则匹配。其中 re.match() 只匹配字符串的开头,而 re.search() 则可以在整个字符串中查找匹配。下面是一个匹配整数的示例:

import re

pattern = r"\d+"  # 匹配一个或多个数字
text = "The number is 123456."
result = re.search(pattern, text)
print(result.group())  # 输出 "123456"

上面的代码首先定义了一个正则表达式模式,使用 \d+ 匹配一个或多个数字。然后使用 re.search() 函数在字符串中查找匹配。最后输出匹配结果的字符串。

类似地,我们可以匹配浮点数,即有小数点的数字。下面是一个示例:

import re

pattern = r"\d+\.\d+"  # 匹配一个浮点数
text = "The price is 3.14 dollars."
result = re.search(pattern, text)
print(result.group())  # 输出 "3.14"

在上面的代码中,我们使用 \d+.\d+ 匹配一个浮点数。注意在正则表达式中,小数点需要转义,即使用 . 而不是 .。最后输出匹配结果的字符串。

匹配科学计数法

科学计数法表示的数字使用 e 或 E 进行幂运算,例如 1.23e+4 表示 1.23 乘以 10 的四次方即 12300。在 Python 中,可以使用小写 e 或大写 E 来表示科学计数法。下面是一个匹配科学计数法的示例:

import re

pattern = r"\d+\.*\d*[eE][-+]?\d+"  # 匹配科学计数法
text = "The speed of light is 3.00e+8 m/s."
result = re.search(pattern, text)
print(result.group())  # 输出 "3.00e+8"

上面的代码使用 \d+.\d[eE][-+]?\d+ 匹配一个科学计数法数字。其中:

  • \d+ 匹配一个或多个数字;
  • .* 匹配零个或多个小数点;
  • \d* 匹配零个或多个数字;
  • [eE] 匹配小写 e 或大写 E;
  • [-+]? 匹配零个或一个正负号;
  • \d+ 匹配一个或多个数字。

最后输出匹配结果的字符串。

提取匹配结果

如果要提取匹配结果中的数字,可以使用正则表达式的捕获组。每个捕获组用圆括号括起来,可以在匹配结果中单独提取。下面是一个提取整数和浮点数的示例:

import re

pattern = r"(\d+)\.?(\d+)?"  # 匹配整数或浮点数
text = "The numbers are 123 and 3.14."
result = re.findall(pattern, text)  # findall 返回所有匹配项的元组
print(result)  # 输出 [('123', ''), ('3', '14')]

上面的代码使用 (\d+).?(\d+)? 捕获一个整数或浮点数。其中:

  • (\d+) 表示匹配一个或多个数字,捕获为第一组;
  • .? 表示匹配零个或一个小数点,注意小数点需要转义;
  • (\d+)? 表示匹配零个或一个以上数字,捕获为第二组,注意加上 ? 表示可选。最后使用 re.findall() 函数返回所有匹配项的元组列表,每个元组对应一个匹配项。

我们可以通过索引访问每个元组中的捕获组,从而提取出匹配的数字。下面是一个提取科学计数法的示例:

import re

pattern = r"(\d+\.*\d*)([eE][-+]?\d+)?"  # 匹配科学计数法
text = "The number is 1.23e+4."
result = re.search(pattern, text)
mantissa, exponent = result.groups()  # 获取两个捕获组
if exponent:  # 如果有指数
    number = float(mantissa) * 10 ** float(exponent[1:])
else:  # 否则为普通浮点数
    number = float(mantissa)
print(number)  # 输出 12300.0

上面的代码使用 (\d+\.*\d*)([eE][-+]?\d+)? 捕获一个科学计数法数字。其中:

  • (\d+.\d) 表示匹配一个或多个数字和零个或多个小数点,捕获为第一组;
  • ([eE][-+]?\d+)? 表示匹配一个指数部分,捕获为第二组,可选。

注意指数部分也要加上正负号和数字,需要用 [eE][-+]?\d+ 匹配。

最后使用 result.groups() 获取两个捕获组的元组,并分别赋值给 mantissa 和 exponent 变量。如果 exponent 不为空,则计算最终结果为 mantissa 乘以 10 的 exponent 次方;否则结果为 mantissa。使用 float() 函数将字符串转换为浮点数,最后输出结果。

转换数字格式

Python 中有几种内置函数可以用来格式化数字,例如 round() 可以将浮点数四舍五入到指定的小数位数,int() 可以将浮点数或字符串转换为整数,str() 可以将数字转换为字符串。

对于需要在大量数据中批量处理数字格式的任务,正则表达式也是一个非常好的选择。下面是一个将科学计数法转换为浮点数的示例:

import re

pattern = r"(\d+\.*\d*)([eE][-+]?\d+)?"  # 匹配科学计数法
text = "The number is 1.23e+4."
result = re.sub(pattern, lambda m: str(float(m.group(1)) * 10 ** float(m.group(2)[1:])) if m.group(2) else m.group(1), text)
print(result)  # 输出 "The number is 12300.0."

上面的代码使用 re.sub() 函数将文本中的科学计数法数字替换为浮点数。使用 pattern 匹配科学计数法,使用 lambda 表达式对每个匹配项进行转换,最后将结果保存到 result 变量中。

在 lambda 表达式中,我们使用 m.group(1) 和 m.group(2) 分别获取两个捕获组的字符串。如果有指数部分,则将数值乘以 10 的 exponent 次方;否则不变。最后将结果转换为字符串返回。

结论

本文介绍了如何使用 Python 正则表达式来匹配数字,包括整数、浮点数和科学计数法。通过简单的示例代码,演示了如何提取匹配结果、转换数字格式等常见操作。正则表达式在文本处理和数字处理中都有重要的应用,掌握它们可以让我们更加高效地处理数据。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程