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
相关产品推荐
相关产品推荐

