You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现:如何从字符串中精准删除所有类型有效数字

实现字符串中有效数字的精准删除

测试用例示例

基础测试用例如下:

inpoot = "A.p.p.l.e (45) Orange (5.11) Kiwi"  # 原始输入
outpoot = "A.p.p.l.e () Orange () Kiwi" # 期望输出

注:变量名使用inpoot而非input,是因为input是Python保留关键字。

初版实现的问题

最开始的实现思路是直接过滤所有数字字符,代码如下:

import string
def kill_numbers(text: str) -> str:
    text = str(text)
    return "".join(filter(lambda ch: ch not in string.digits, text))

该方案存在明显缺陷:小数中的小数点会被保留,多个测试场景输出不符合预期:

  • 输入"A.p.p.l.e (45) Orange T5.11T Kiwi 99 Apricot"时,输出为'A.p.p.l.e () Orange T.T Kiwi',残留了小数点,数字两侧的T应拼接为TT,而非被小数点分隔为T.T
  • 输入"Strawberry 3.145 Plum"时,无法删除3.145对应的小数点
  • 输入"3.14"时输出为".",期望输出为空字符串

正则方案的局限

后续尝试改用正则表达式替换实现,测试正则[0-9]+\.?[0-9]*|\.[0-9]+仅能通过部分用例。前后共验证了10余种常见的数值匹配正则,所有正则均无法满足以下硬性要求:

  • 不得匹配空字符串""
  • 不得匹配含多个小数点的版本号类字符串(如"3.10.4"),即待删除的数字最多只能包含1个小数点
  • 不得匹配孤立的小数点"."

有效数字判定规则

我们明确定义了待删除的有效数字所属的形式语言L:

  1. 初始种子集合包含以下数值格式:(1, 365, 9.43, -5000, +10, 0001, .5, 0x77F, 3.456e11),覆盖整数、带符号整数、前缀点小数、常规小数、十六进制数、科学计数法数值六类常见数值
  2. 满足以下任意一条生成规则的字符串,也属于L的范畴:
    • 将种子数字中任意数字迭代替换为99
    • 将有效数字中任意数字替换为其他数字
    • 将十六进制格式0xF中的F替换为2F、F2或A/B/C/D/E

实现要求

需要设计算法A:对于任意有限长度的ASCII输入字符串s,输出处理后的字符串s'。处理逻辑为:将s中所有属于语言L的极长子串(即无法向左右任意一侧扩展1个字符后,子串仍属于L)替换为空字符串,要求始终匹配最长的有效数字子串进行删除,避免误删孤立小数点、版本号、句尾点号等非数字内容。


内容的提问来源于stack exchange,提问作者Toothpick Anemone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:01:11