如何提取文本文件中>开头行之间的内容及末尾内容?
问题描述
给定如下文本文件内容:
>rice1 1ALBRGHAER NNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN >peanuts2 2LAEKaq SSSSSSSSSSS >OIL3 3hkasUGSV ppppppppppppppppppppp ppppppppppppppppppppp
需要提取所有位于含>的行之间,以及最后一段无结尾>行的内容,预期结果为:
result = ['NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN','SSSSSSSSSSS','pppppppppppppppppppppppppppppppppppppppppp']
我自己写的代码无法实现需求,运行后仅返回空字符串,代码如下:
def findtext(inputtextfile, start, end): try: pattern=rf'{start}(.*?){end}' return re.findall(pattern, inputtextfile) except ValueError: return -1 result = findtext(inputtextfile,"\n", ">")
解决方案
你的代码思路不对,因为你用换行符和>作为匹配边界,但原文本里>在行首,而且你要抓的是两个>行之间的所有非>开头的内容,还要包含最后一段没结尾>的部分。
下面给两种可行的实现方法:
方法一:逐行遍历分组
直接按行拆分文本,遇到>开头的行就收尾上一组内容,开始新的分组;否则把当前行内容加到当前分组里:
def extract_content(text): lines = text.strip().split('\n') result = [] current_group = [] for line in lines: if line.startswith('>'): # 上一组有内容就先存起来 if current_group: result.append(''.join(current_group)) current_group = [] else: current_group.append(line.strip()) # 处理最后一组没被收尾的内容 if current_group: result.append(''.join(current_group)) return result # 测试用例 input_text = """ >rice1 1ALBRGHAER NNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN >peanuts2 2LAEKaq SSSSSSSSSSS >OIL3 3hkasUGSV ppppppppppppppppppppp ppppppppppppppppppppp """ result = extract_content(input_text) print(result)
方法二:正则表达式匹配
用正则匹配所有被>行分隔的非>开头内容块,再处理掉换行符:
import re def extract_content(text): # 正则规则:匹配在>行之后、下一个>行或文本结尾之前的所有非>内容 pattern = r'(?<=^>.*\n)([^>]+)(?=\n>|\Z)' # 开启多行模式和DOTALL模式,让.能匹配换行符 matches = re.findall(pattern, text, re.MULTILINE | re.DOTALL) # 把每个匹配块里的换行符去掉,合并成纯字符串 return [''.join(match.split()) for match in matches] # 测试用例 input_text = """ >rice1 1ALBRGHAER NNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN >peanuts2 2LAEKaq SSSSSSSSSSS >OIL3 3hkasUGSV ppppppppppppppppppppp ppppppppppppppppppppp """ result = extract_content(input_text) print(result)
你的代码问题在哪?
你写的正则rf'\n(.*?)>'是找换行符和>之间的内容,但原文本里换行后直接就是>行,中间没有内容,所以返回空。而且这个正则根本覆盖不到最后一段没有结尾>的内容,自然满足不了需求。
内容的提问来源于stack exchange,提问作者newbzzs
相关产品推荐
相关产品推荐

