Python从含数字的字符串中提取数值的通用方法咨询
通用数字提取方案:用正则搞定无固定格式的数字提取
完全可以写通用代码,核心就是用正则表达式匹配数字的通用特征,不用针对每种字符串单独写逻辑。
核心思路
你的所有目标数字都符合这个特征:可选负号、整数部分、可选小数点+小数部分、可选末尾的百分号。直接用正则匹配这个模式就行,不管前后的符号(>=、<=这些)和分隔符(or/and)是什么。
正则模式说明
用这个正则就能匹配你所有示例里的数字:
-?\d+\.?\d*%?
拆解下每个部分:
-?:匹配可选的负号(比如-6.25里的-)\d+:匹配至少一位整数(比如5、6、3这些)\.?:匹配可选的小数点(有的数字是整数,有的带小数)\d*:匹配可选的小数部分(0位或多位数字,比如5.0里的0,-7.813里的813)%?:匹配可选的百分号(有的数字带%,有的不带)
代码示例(Python)
直接写个函数,传入任意字符串就能提取数字:
import re def get_numbers_from_str(input_str): # 定义匹配数字的正则 num_pattern = r'-?\d+\.?\d*%?' # 找出所有匹配的数字 matched_nums = re.findall(num_pattern, input_str) # 可选:把带%的转成浮点数(如果需要数值计算) processed_nums = [] for num in matched_nums: # 去掉%,转成浮点数 clean_num = num.replace('%', '') processed_nums.append(float(clean_num)) return processed_nums # 测试你的示例字符串 test_cases = [ ">=5.0% or <=-6.25%", ">=6.25% or <=-7.813%", "<2.5% and >-3.125", ">=2.5% or <=-3.125%", ">=5.0% or <=-6.25%", "<5.0% or >-6.25%", "<3.125 and >-3.906%" ] for case in test_cases: print(f"原字符串:{case}") print(f"提取的数字:{get_numbers_from_str(case)}\n")
通用性扩展
如果后续遇到其他数字格式(比如科学计数法1.2e-3),只需修改正则模式,比如改成:
-?\d+\.?\d*(?:e[+-]?\d+)?%?
就能覆盖科学计数法的情况。
注意事项
- 如果字符串里出现非目标数字(比如日期、序号),可能需要结合上下文过滤,但根据你的示例,当前正则完全够用。
- 如果不需要转成数值,直接返回
matched_nums就能保留带%的原始字符串形式。
内容的提问来源于stack exchange,提问作者Andy Reagan
相关产品推荐
相关产品推荐

