如何用正则表达式提取连续的星号开头项目符号行?
问题描述
我有如下文本:
* 项目符号列表中的某段文本。 * 同个项目符号列表中的另一段文本 用若干行普通文本打破这个模式。 这段普通文本会持续几行 * 回到项目符号列表的某段文本 * 继续列表内容
我希望编写一个正则表达式,提取所有属于项目符号列表的连续行。例如在上述示例中,我需要选中以下内容:
分组 1 * 项目符号列表中的某段文本。 * 同个项目符号列表中的另一段文本 分组 2 * 回到项目符号列表的某段文本 * 继续列表内容
我尝试了多个正则表达式,但无法将提取范围限制为连续的列表。例如正则表达式 re.findall(r"\* +(.*+)", text) 会将所有项目符号列表返回为单个组(无法按连续项目符号行拆分)。
解决方案
要实现按连续块提取项目符号列表,你可以使用支持多行模式的正则表达式,匹配连续的、以星号(行首允许有空格)开头的行。
代码实现
import re text = """ * 项目符号列表中的某段文本。 * 同个项目符号列表中的另一段文本 用若干行普通文本打破这个模式。 这段普通文本会持续几行 * 回到项目符号列表的某段文本 * 继续列表内容 """ # 匹配连续的项目符号行块 pattern = r'(^\s*\*.*(?:\n\s*\*.*)*)' list_blocks = re.findall(pattern, text, re.MULTILINE) # 输出结果 for i, block in enumerate(list_blocks, 1): print(f"分组 {i}") print(block) print()
正则逻辑解释
re.MULTILINE:让^符号匹配每一行的开头(而非整个文本的开头)^\s*\*.*:匹配单一行的项目符号内容(行首空格+星号+行内内容)(?:\n\s*\*.*)*:非捕获组,匹配后续所有连续的同格式列表行,确保只提取连续的列表块
运行这段代码后,会得到两个独立的分组,完全符合你拆分连续列表的需求。
内容的提问来源于stack exchange,提问作者A.Lovelace
相关产品推荐
相关产品推荐

