Python如何按连续整数、括号分割字符串得到指定格式列表
字符串分割需求实现
分割规则
- 在所有整数位置分割,直接相邻的连续整数作为整体保留,不做拆分
- 在
(、)字符位置同步分割字符串
问题复现
测试代码:
import re myStr = "H12(O1H2)2O2C1" list1 = re.split('(\d+)', myStr) print(list1) list1 = re.split('(\W)', myStr) print(list1)
- 预期输出:
['H', '12', '(', 'O', '1', 'H', '2', ')', '2', 'O', '2', 'C', '1'] - 实际执行
re.split('(\d+)', myStr)输出:['H', '12', '(O', '1', 'H', '2', ')', '2', 'O', '2', 'C', '1'],左括号与后续字母O被合并为同一个元素,未按要求拆分。对首次分割结果二次分割未生效,且后续字符串为用户动态输入,无法通过固定索引处理固定字符串的方式解决,需要通用实现方案。
实现方案
直接使用re.findall一次性匹配所有需要保留的片段即可,不需要多次调用split。正则规则同时匹配三类目标内容:连续数字、单个括号、连续的非数字非括号字符,天然满足分割要求。
实现代码:
import re myStr = "H12(O1H2)2O2C1" res = re.findall(r'\d+|[()]|[^()\d]+', myStr) print(res)
执行后输出完全符合预期:['H', '12', '(', 'O', '1', 'H', '2', ')', '2', 'O', '2', 'C', '1']
正则逻辑说明
\d+:匹配连续数字串,保证连续整数作为整体不拆分[()]:匹配单个左/右括号,保证括号单独作为一个元素分割[^()\d]+:匹配连续的非数字、非括号字符,遇到数字或括号时自然断开,不需要额外处理边界
该方案为通用实现,适配任意动态输入的符合规则的字符串,不依赖固定索引位置,也不需要二次遍历处理分割结果。
内容的提问来源于stack exchange,提问作者Eli Steinerman
相关产品推荐
相关产品推荐

