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

如何用Python实现Number-span elision(数字跨度省略)功能?

实现数字跨度省略(Number-span elision)的Python代码

需求说明

数字跨度省略(又称数字缩写、digit-dropping)是指将页码等数字范围进行缩写,保留起始数字的完整形式,结束数字仅保留与起始数字从左到右第一个不同位开始的剩余部分。典型示例:

  • 42–43 → 42–3
  • 123–128 → 123–8
  • 100–104 → 100–4
  • 1496–1500 → 1496–500

实现思路

  1. 将输入的跨度字符串按特定分隔符–分割为起始数字和结束数字
  2. 把两个数字转为字符串,方便逐位对比字符
  3. 从左到右遍历字符,找到第一个不相同的位置索引
  4. 截取结束数字从该索引开始的部分,作为缩写后的内容
  5. 拼接起始数字、分隔符和缩写后的结束数字,得到最终结果

Python代码实现

def elide_number_span(span_str):
    # 按全角破折号分割起始与结束数字
    start_str, end_str = span_str.split('–')
    common_prefix_len = 0
    max_compare_len = min(len(start_str), len(end_str))
    
    # 遍历找到最长公共前缀的长度
    while common_prefix_len < max_compare_len and start_str[common_prefix_len] == end_str[common_prefix_len]:
        common_prefix_len += 1
    
    # 截取结束数字的非公共前缀部分
    elided_end = end_str[common_prefix_len:]
    return f"{start_str}–{elided_end}"

# 测试示例输入
test_cases = [
    "3–10",
    "12–18",
    "71–72",
    "96–117",
    "100–104",
    "1100–1113",
    "101–108",
    "808–833",
    "1103–1104",
    "321–328",
    "498–532",
    "1013–1019",
    "1087–1089",
    "1496–1500",
    "11564–11615",
    "12991–13001"
]

# 输出测试结果
for case in test_cases:
    print(f"{case} → {elide_number_span(case)}")

测试输出

运行代码后,输出结果如下:

3–10 → 3–10
12–18 → 12–8
71–72 → 71–2
96–117 → 96–117
100–104 → 100–4
1100–1113 → 1100–13
101–108 → 101–8
808–833 → 808–33
1103–1104 → 1103–4
321–328 → 321–8
498–532 → 498–532
1013–1019 → 1013–9
1087–1089 → 1087–9
1496–1500 → 1496–500
11564–11615 → 11564–615
12991–13001 → 12991–3001

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:18:39