Python re.findall匹配含换行段落 提取包含指定字符串内容的方法
正确实现方式
方案1:先分段再过滤(更简单易维护,无需复杂正则)
直接按空行拆分文本为独立段落,再过滤包含目标字符串的段落,替换段落内的换行即可:
text = """test textract. new line test word. another line.""" myword = "word" # 按两个连续换行拆分段落,去除首尾空白 paragraphs = [p.strip() for p in text.split('\n\n')] # 筛选包含目标词的段落,替换内部换行符为空格 result = [p.replace('\n', ' ') for p in paragraphs if myword in p] print(result) # 输出:['new line test word.']
方案2:正则实现
需要解决你之前写法的三个核心问题:
- 正则默认
.不匹配换行符,需要加re.DOTALL标志开启匹配 - 避免用普通捕获组
(),否则re.findall会优先返回分组内容而非完整匹配结果,改用非捕获组(?:) - 目标词要加
re.escape()转义,避免目标词包含正则特殊字符时报错
代码如下:
import re text = """test textract. new line test word. another line.""" myword = "word" matches = re.findall( r'(?<=\n\n)(?:.*?' + re.escape(myword) + r'.*?)(?=\n\n)', text, flags=re.DOTALL ) # 替换段落内换行 result = [m.strip().replace('\n', ' ') for m in matches] print(result) # 输出:['new line test word.']
之前写法失效的原因
- 未开启
re.DOTALL,.无法匹配换行符,跨行的段落内容自然匹配不到 - 用了普通捕获组
(),re.findall优先返回分组内容,导致返回的是空分组结果而非完整段落 - 错误使用
|或逻辑,.|\n会将内容拆分为单个字符匹配,无法拿到完整段落
内容的提问来源于stack exchange,提问作者Bill Zhao
相关产品推荐
相关产品推荐

