如何用正则匹配多行条目?解决多行描述的条目提取问题
多行条目描述的正则提取解决方案
你的原正则仅能匹配单行描述,无法捕获跨换行的条目内容,核心原因是没有处理“条目描述持续到下一个条目开头”的逻辑。以下是可行的解决方法:
适配多行的正则表达式
使用以下正则(需开启多行模式re.MULTILINE):
r'^(:[a-zA-Z0-9_]+)\s+([\s\S]*?)(?=\n:|\Z)'
正则各部分解析
^(:[a-zA-Z0-9_]+):匹配行首的条目名称(确保以:开头),捕获为第一个分组。\s+:匹配条目名与描述之间的任意空白(制表符、空格均支持)。([\s\S]*?):非贪婪模式匹配任意字符(含换行),避免过度匹配到下一个条目。(?=\n:|\Z):正向预查,匹配到下一个条目开头(换行+:)或文件结尾时停止,精准截断描述内容。
Python代码示例
import re # 你的文件内容 content = """#% text_encoding = utf8 :xy_name1 Text :xy_name2 Text text text to a text. Text and text to text text, text and text provides text text text text. :xy_name3 Text """ # 匹配规则 pattern = r'^(:[a-zA-Z0-9_]+)\s+([\s\S]*?)(?=\n:|\Z)' matches = re.findall(pattern, content, re.MULTILINE) # 处理并输出结果 for entry, desc in matches: # 可选:清理描述中的多余换行和空白 cleaned_desc = re.sub(r'\s+', ' ', desc).strip() print(f"条目: {entry}") print(f"描述: {cleaned_desc}\n")
运行结果
条目: :xy_name1 描述: Text 条目: :xy_name2 描述: Text text text to a text. Text and text to text text, text and text provides text text text text. 条目: :xy_name3 描述: Text
注意事项
- 非贪婪模式
*?是关键,防止将多个条目内容合并为一个描述。 - 若需保留原始换行格式,可跳过
cleaned_desc的清理步骤,直接使用原始捕获的desc。
内容的提问来源于stack exchange,提问作者Jan Nowak
相关产品推荐
相关产品推荐

