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