我正在遍历一个非常大的(~5GB)文本文档,如下所示:
<P ID=912>
bird
dog
dog
dog
</P>
<P ID=5>
aardvark
bird
bird
cat
egret
</P>
<P ID=291>
aardvark
aardvark
aardvark
aardvark
aardvark
bird
dog
fish
fish
fish
</P>
<P ID=621>
aardvark
aardvark
bird
dog
fish
fish
fish
</P>
<P ID=5>
bird
egret
egret
</P>
<P ID=1>
bird
</P>
从id没有组织的意义上说,文档非常“无序”。我需要创建一个解决方案来遍历每个段落(由<P ID = x></P>
标记表示,它将一直存在),并提取ID号。在
我使用NLTK
来标记段落,这很好,我的问题是我无法从标记中提取ID
。在
导致:
Current paragraph Number: None
Current paragraph Number: None
Current paragraph Number: None
Current paragraph Number: None
Current paragraph Number: None
Current paragraph Number: None
但我希望它看起来像:
Current paragraph Number: 912
Current paragraph Number: 5
Current paragraph Number: 291
Current paragraph Number: 621
Current paragraph Number: 5
Current paragraph Number: 1
我需要如何更改:para_id = re.match("<P ID=\d+>", para)
编辑:
我也尝试过:
para_id = [i['id'] for i in soup(para, 'html.parser').find_all('p')]
但这产生了一个空白[]
我不知道为什么我不能创建一个只有单数段的汤
注意-我应该提到这是代码的一个最小的例子。真正的程序要大得多,并且需要NLTK来解析,因为我经常使用停止词和文本标记。在
你在哪里捕捉段落的文字但是 你应该捕获包括P标记在内的整个段落, 在捕获段落的Id之后,我使用了您的simple in
data.txt
:输出:
^{pr2}$你在读整个5 GB的文件我觉得你应该用生成器, 如果只需要打印段落Id:
这将生成相同的结果,而不会将整个5 GB加载到内存中。在
一种可能的解决方案是,在使用
NLTK
处理后,将输入传递给BeautifulSoup
:输出:
^{pr2}$BeautifulSoup
使您能够使用soup.contents
访问段落内容:输出:
将
r'(?s)<P\s*ID\s*=\s*(\d+)\s*>(.*?)</P\s*>'
与findall()搜索一起使用。ID
在捕获组1中,Content
在捕获组2中。在示例
相关问题 更多 >
编程相关推荐