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

