如何用Python统计字符串中的整数与非整数数量?
解决Python统计句子中整数与非整数数量的问题
问题分析
你原来的代码用\d+会把小数里的数字片段也当成独立数字(比如3.14会被拆成3和14两个匹配项),这就导致总数字数统计错误,自然没法通过相减得到正确结果。要解决这个问题,得分别精准匹配独立整数和带小数点的非整数。
实现思路
- 整数匹配:要确保数字是独立的,不是小数的一部分,用正则
(?<!\.)\b\d+\b(?!\.),意思是:(?<!\.):数字前面不能有小数点\b\d+\b:匹配连续的纯数字(单词边界确保不会匹配更长字符串里的数字片段)(?!\.):数字后面不能有小数点
- 非整数(小数)匹配:匹配带有小数点的数字,用正则
\b\d+\.\d+\b,匹配既有整数部分又有小数部分的数字(比如3.14)
完整代码
import re def count_numbers(entry): # 匹配独立整数 integers = re.findall(r'(?<!\.)\b\d+\b(?!\.)', entry) num_integers = len(integers) # 匹配带小数点的非整数 non_integers = re.findall(r'\b\d+\.\d+\b', entry) num_non_integers = len(non_integers) return num_integers, num_non_integers # 测试示例 test_sentence = "In 2014 we Celebrated 3.14 with 3 whole pies" int_count, non_int_count = count_numbers(test_sentence) print(f"{int_count}个整数、{non_int_count}个非整数")
代码说明
- 运行测试示例会输出
2个整数、1个非整数,完全符合你的需求。 - 如果需要支持更复杂的小数格式(比如
.5或5.),可以把非整数的正则调整为\b(?:\d+\.\d*|\.\d+)\b,这样就能匹配这类边缘情况。
内容的提问来源于stack exchange,提问作者gamertamer
相关产品推荐
相关产品推荐

