Python中如何用正则表达式分割带编号列表格式的字符串?
解决方案:用正则断言精准匹配列表编号
要规避分割带小数点的数字(如货币),核心是只匹配列表项的编号点——也就是那种前面是字符串开头/空白、后面跟着空白的数字+.组合,而非数字内部的小数点。
可以用带断言的正则表达式实现:
import re def split_list_string(s): # 分割匹配:前面是开头/空白,后面是空白的 数字+. parts = re.split(r"(?<=^\s*|\s)\d+\.(?=\s)", s) # 过滤空项并去除首尾空白 return [item.strip() for item in parts if item.strip()]
正则表达式解释
(?<=^\s*|\s):正向回顾后发断言,确保数字+.的前面是:^\s*:字符串开头(允许带前置空白,比如缩进的列表)- 或
\s:任意空白字符(空格、制表符等)
这就排除了像$2.2里2.前面是数字2的情况。
\d+\.:匹配1个及以上数字加小数点(?=\s):正向先行断言,确保小数点后面是空白字符,只匹配列表编号(比如1.),而非数字内部的点(比如2.2里的2.后面是数字2)
测试示例
- 普通列表字符串:
s1 = "1. one. 2. two. 3. three." print(split_list_string(s1)) # 输出:['one.', 'two.', 'three.']
- 带货币的列表字符串:
s2 = "1. I have $2.2 million. 2. blah blah." print(split_list_string(s2)) # 输出:['I have $2.2 million.', 'blah blah.']
扩展场景适配
如果列表编号后面是换行(比如多行列表),这个正则也能正常工作,因为(?=\s)会匹配换行符。例如:
s3 = """1. First item 2. Second item with $3.5 budget 3. Third item""" print(split_list_string(s3)) # 输出:['First item', 'Second item with $3.5 budget', 'Third item']
内容的提问来源于stack exchange,提问作者anonYmOusee
相关产品推荐
相关产品推荐

