在文本处理场景中,我们经常会遇到需要从一段混合内容中提取整数和分数的需求,比如从实验报告、财务数据或者日志文件中筛选数值信息。Python的re模块内置了正则表达式处理能力,通过编写合适的匹配规则,可以高效完成这类提取工作,避免手动遍历字符的低效操作。

基础概念说明
整数是不包含小数点的非负或负整数,分数由分子、分母和中间的斜杠组成,分子和分母都是整数。使用正则表达式提取时,需要先明确这两类数值的字符组成规则,再编写对应的匹配模式。
正则表达式核心符号
d:匹配任意单个数字字符,等价于[0-9]+:匹配前面的字符一次或多次-:匹配负号,需要放在合适的位置表示负数/:匹配分数的分隔斜杠re.findall():返回字符串中所有匹配正则表达式的子串列表
整数的提取方法
整数的匹配规则相对简单,需要考虑正负数的情况,同时要避免把分数中的分子或分母误判为整数。基础的匹配模式可以写成-?d+,其中-?表示负号可选,d+表示一个或多个数字。
基础整数提取示例
以下代码演示了从混合文本中提取所有整数的过程:
import re text = "本次实验测得三个数值:12,-45,78,还有分数3/4和-2/5,另外还有个0" # 匹配整数的正则表达式,避免匹配分数中的数字 pattern = r'(?<!/)-?d+' result = re.findall(pattern, text) print(result) # 输出:['12', '-45', '78', '0']
这里使用了负向回顾后发断言(?<!/),确保匹配的数字前面不是斜杠,避免把分数的分母部分误判为整数。
分数的提取方法
分数的结构是可选负号+分子+斜杠+分母,分子和分母都是整数,因此匹配模式可以写成-?d+/d+,需要注意排除分母为0的无效分数,同时避免和整数的匹配规则冲突。
基础分数提取示例
以下代码演示了从文本中提取所有有效分数的过程:
import re text = "本次实验测得三个数值:12,-45,78,还有分数3/4和-2/5,无效分数1/0,另外还有个0" # 匹配分数的正则表达式,排除分母为0的情况 pattern = r'-?d+/(?!0)d+' result = re.findall(pattern, text) print(result) # 输出:['3/4', '-2/5']
这里使用了负向预测先行断言(?!0),确保斜杠后面的第一个数字不是0,避免匹配分母为0的无效分数。
同时提取整数和分数的完整方案
如果需要从同一段文本中同时提取整数和分数,并且避免重复匹配,可以将两个匹配规则组合,使用或运算符|连接,同时调整匹配顺序,先匹配分数再匹配整数,避免分数的部分被整数规则提前匹配。
组合提取示例
以下代码实现了整数和分数的同时提取:
import re text = "本次实验测得三个数值:12,-45,78,还有分数3/4和-2/5,无效分数1/0,另外还有个0" # 先匹配分数,再匹配整数,避免分数部分被整数规则拆分 pattern = r'-?d+/(?!0)d+|(?<!/)-?d+' result = re.findall(pattern, text) print(result) # 输出:['12', '-45', '78', '3/4', '-2/5', '0']
常见误区与优化
- 不要直接使用
d+匹配整数,否则会把分数的分子分母也匹配出来,导致结果混乱 - 分数的匹配需要添加分母不为0的校验,避免提取无效数据
- 如果文本中存在小数,需要额外调整匹配规则,避免把小数的小数点部分误判为分数斜杠
- 对于复杂的文本场景,可以先对文本做预处理,比如去除无关的特殊字符,再执行匹配操作,提升准确率
总结
使用Python正则表达式提取整数和分数的核心是编写准确的匹配规则,合理利用断言避免误匹配,同时根据场景需求调整规则的优先级。掌握上述方法后,可以快速应对大部分文本数值提取的需求,提升数据处理的效率。