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

Python实现含短横线的混合字符串拆分 分离文本与数字编号

解决方案

你的输入存在明确结构:字符串前半段为不含数字的章节名(支持阿拉伯语原文、拉丁转写两种形式),后半段为位于字符串末尾、格式为数字-数字的节号,之前匹配失败基本是因为正则规则只覆盖了拉丁字母区间,遗漏了阿拉伯语对应的Unicode字符。
下面提供两种可直接运行的实现,两种方案均同时兼容阿拉伯语原文和拉丁转写输入:

  • 正则匹配方案(代码最简洁,推荐优先使用)
  • 逐字符遍历方案(无正则依赖,逻辑直观)

正则匹配实现

正则不需要单独枚举阿拉伯语的字符区间,直接用通用非数字匹配规则即可覆盖所有语言的章节名场景:

import re

# 待处理的原始字符串列表,可同时放入阿拉伯语原文和拉丁转写内容
raw_strings = ["الشورى22-23", "السجدة44-55", "Alshoura22-23", "Alsadjah44-55"]
chapter = []
verse = []

# 规则说明:
# ^(\D+) 从字符串开头匹配所有连续非数字字符,作为章节名
# (\d+-\d+)$ 匹配字符串末尾的「数字-数字」格式内容,作为节号
split_pattern = re.compile(r'^(\D+)(\d+-\d+)$')
for s in raw_strings:
    match = split_pattern.match(s)
    if match:
        chapter.append(match.group(1))
        verse.append(match.group(2))

# 输出符合预期:
# chapter = ["الشورى", "السجدة", "Alshoura", "Alsadjah"]
# verse = ["22-23", "44-55", "22-23", "44-55"]

该方案鲁棒性较强,只要输入符合「章节名不含数字、节号为数字-数字格式位于末尾」的规则,哪怕后续新增其他语言的章节名也不需要修改规则。

逐字符遍历实现

如果不想引入正则依赖,可以逐字符查找第一个数字出现的位置,以该位置为分割点切分字符串即可:

raw_strings = ["الشورى22-23", "السجدة44-55", "Alshoura22-23", "Alsadjah44-55"]
chapter = []
verse = []

for s in raw_strings:
    # 定位第一个数字的下标
    split_pos = 0
    for i, c in enumerate(s):
        if c.isdigit():
            split_pos = i
            break
    chapter.append(s[:split_pos])
    verse.append(s[split_pos:])

常见踩坑点

  • 禁止用[a-zA-Z]作为章节名匹配规则:该范围仅覆盖拉丁字母,完全无法匹配阿拉伯语等非拉丁字符,必然导致匹配失败
  • 不要用固定长度切分:不同章节名的字符长度不一致,固定长度切分无法适配所有章节
  • 不需要单独维护阿拉伯语Unicode字符区间:用非数字匹配、isdigit()判断的通用逻辑,适配性远高于枚举字符区间的方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:36:23