Python多行文本正则匹配:捕获指定speakerA至votC区块内容
Python正则匹配跨多行文本解决方案
匹配规则明确
需要捕获的内容范围:
- 起始:以包含投票关键词的
speakerA行开头,关键词包括lets beginning to vote、go to vote、have voting、beginning to vote - 结束:到
votC:行及其后续所有内容为止(直到下一个投票块起始行或文本结尾)
正则方案实现
针对需求,结合Python正则特性,使用以下模式:
import re pattern = re.compile( r'^speakerA[::] (?:lets beginning to vote|go to vote|have voting|beginning to vote)\n.*?^votC:.*?(?=^speakerA[::] |\Z)', re.DOTALL | re.MULTILINE )
关键参数与逻辑说明
re.DOTALL:让.匹配包括换行符在内的所有字符,解决跨多行匹配问题re.MULTILINE:让^和$匹配每行的开头和结尾,而非整个文本的首尾speakerA[::]:兼容示例中出现的中文冒号:和英文冒号:.*?:非贪婪匹配,避免一次性匹配到文本末尾的重复块(?=^speakerA[::] |\Z):正向预查,确保匹配到votC:的内容后,在下一个speakerA行或文本结尾处停止,不会包含下一个投票块的内容
测试与提取
使用findall或search方法提取内容:
matches = pattern.findall(your_text) for full_match in matches: print(full_match)
原问题分析
你之前的正则r'(^speakerA:.*\n(.*\n)?^(voting))'存在两个核心问题:
- 未启用
re.DOTALL,.无法匹配换行符,导致跨多行内容无法完整捕获 - 匹配逻辑仅局限于到
(voting)行,未覆盖后续的list*和vot*行,不符合更新后的需求
内容的提问来源于stack exchange,提问作者matsuri
相关产品推荐
相关产品推荐

