如何用Python正则表达式提取编号列表中的段落文本?
Python正则提取编号列表文本的方案
直接提取单行内容的最简方案
如果你的列表项都是单行内容,用下面的正则配合re.findall()就能搞定:
import re target_text = """1. foobar 2. foo 3. bar""" extracted = re.findall(r'\d+\.\s*(.*)', target_text) print(extracted) # 输出: ['foobar', 'foo', 'bar']
正则说明:
\d+:匹配1个及以上的数字编号\.:匹配编号后的点(必须转义,不然.会匹配任意字符)\s*:匹配点后面的任意空白(空格、制表符都能覆盖)(.*):捕获点和空白之后的所有内容,刚好就是你要的纯文本
支持多行内容的进阶方案
如果列表项可能跨多行,就加上re.DOTALL标志,用带正向预查的正则:
import re target_text = """1. foobar extra line here 2. foo 3. bar""" extracted = re.findall(r'\d+\.\s*(.*?)(?=\n\d+\.|$)', target_text, re.DOTALL) # 清理每个结果的首尾空白和换行 cleaned = [item.strip() for item in extracted] print(cleaned) # 输出: ['foobar\nextra line here', 'foo', 'bar']
正则说明:
(?=\n\d+\.|$):正向预查,找到下一个编号行或者文本结尾的位置,避免把下一个编号的内容也抓进来re.DOTALL:让正则里的.能匹配换行符,这样就能捕获跨多行的列表项内容
你的原正则为啥失效?
你写的r'\d+.*?(?=\d|$)'问题出在:
- 它会把编号、点号、空格都包含在匹配结果里,没法精准提取后面的纯文本
.*?的非贪婪匹配会过早停止,或者把不需要的符号也带进来,自然得不到你要的结果
内容的提问来源于stack exchange,提问作者user1753640
相关产品推荐
相关产品推荐

