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

如何用Python的re.split直接分隔相邻不同数字间的字符串?

用单个re.split实现指定字符串分割

我需要将字符串 "91234 5g5567 7₇89^" 分割为列表 ["9","1","2","3","4 5g55","67 7₇8","9^"],分割规则是仅在两个直接相邻且互不相同的半角阿拉伯数字(0-9)之间分割,其他情况(数字与非数字相邻、相同数字相邻)都不分割。

我尝试过两种方法,但都不够简洁:

import re
def way0(char: str):
    delimiter = ""
    while True:
        delimiter += " "
        if delimiter not in char:
            substitution = re.compile("([0-9])(?!\\1)([0-9])")
            replacement = "\\1"+delimiter+"\\2"
            cin = [char]
            while True:
                cout = []
                for term in cin: cout.extend(substitution.sub(replacement,term).split(delimiter))
                if cout == cin:
                    return cin
                else:
                    cin = cout

way0("91234 5g5567	7₇89^")
# 输出:['9', '1', '2', '3', '4 5g55', '67	7₇8', '9^']
import itertools
way1 = lambda w: ["".join(list(y)) for x, y in itertools.groupby(re.split("(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)", w), lambda z: z != "") if x]

way1("91234 5g5567	7₇89^")
# 输出:['9', '1', '2', '3', '4 5g55', '67	7₇8', '9^']

我直接用re.split尝试了以下正则,但结果不符合预期:

re.split(r"(\d)(?!\1)(\d)","91234 5g5567	7₇89^")
# 输出:['', '9', '1', '', '2', '3', '4 5g5', '5', '6', '7	7₇', '8', '9', '^']

解决方案

可以直接用re.split实现,核心是用零宽断言精准匹配“两个不同半角数字相邻”的分割位置,正则表达式如下:

import re

s = "91234 5g5567	7₇89^"
pattern = r'(?<=[0-9])(?=(?:0(?=[1-9])|1(?=[02-9])|2(?=[013-9])|3(?=[0124-9])|4(?=[0-35-9])|5(?=[0-46-9])|6(?=[0-57-9])|7(?=[0-68-9])|8(?=[0-79])|9(?=[0-8])))'
result = re.split(pattern, s)
print(result)
# 输出:['9', '1', '2', '3', '4 5g55', '67	7₇8', '9^']

正则解释

  • (?<=[0-9]):正向回顾后发断言,确保当前位置前是一个半角数字
  • (?=(?:...)):正向先行断言,确保当前位置后是一个与前面不同的半角数字,其中每个分支(如0(?=[1-9]))匹配“当前是0,后面跟着1-9中的一个”的场景,覆盖所有数字互不相同的相邻情况

这样通过re.split直接分割即可得到目标结果,无需额外转换处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:44:52