【发布时间】:2020-01-28 13:56:09
【问题描述】:
我正在循环浏览一个非常大 (~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。
import nltk
from nltk.tokenize import word_tokenize, RegexpTokenizer
import re
def get_input(filepath):
f = open(filepath, 'r')
content = f.read()
return content
def main():
myfile = get_input("filepath")
p = r'<P ID=\d+>(.*?)</P>'
paras = RegexpTokenizer(p)
para_id = 0
for para in paras.tokenize(myfile):
para_id = re.match("<P ID=\d+>", para)
print("Current paragraph Number: {}".format(para_id))
main()
导致:
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 来解析,因为我在停用词和文本标记化方面做了很多工作。
【问题讨论】:
-
您可能只需要
re.search而不是re.match。 -
不幸的是,将
re.match更改为re.search会产生相同的结果。
标签: python regex python-3.x beautifulsoup nltk