gpt4 book ai didi

Python 正则表达式不提取值 - Python 3.x

转载 作者:行者123 更新时间:2023-11-28 21:31:25 32 4
gpt4 key购买 nike

我正在遍历一个非常大(~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 来解析,因为我在停用词和文本标记化方面做了很多工作。

最佳答案

你在哪里捕获了段落的文本但是您应该捕获包括 P 标签在内的完整段落,在你捕获段落的 Id 之后,我在 data.txt 中使用了你的简单:

from nltk.tokenize import word_tokenize, RegexpTokenizer
import re

def get_input(filepath):
f = open(filepath, 'r')
content = f.read()
f.close() # don't forget to close file
return content

def main():
myfile = get_input("data.txt")
# here capture the full paragraph
p = r'<P ID=\d+>.*?</P>'
paras = RegexpTokenizer(p)
para_id = 0
for para in paras.tokenize(myfile):
# and here just catch the ID
para_id = re.match("<P ID=(\d+)>", para)
print("Current paragraph Number: {}".format(para_id.group(1)))

main()

输出:

Current paragraph Number: 912
Current paragraph Number: 5
Current paragraph Number: 291
Current paragraph Number: 621
Current paragraph Number: 5
Current paragraph Number: 1

你正在阅读整个 5 GB 的文件,我认为你应该为此使用生成器,如果您只需要打印段落 ID:

import re


def main():
with open("data.txt") as f: # Using context manager to close resource
for line in f:
# and here just catch the ID
match = re.match("<P ID=(\d+)>", line)
if match:
print("Current paragraph Number: {}".format(match.group(1)))

main()

这将生成相同的结果,而无需将整个 5 GB 加载到内存。

关于Python 正则表达式不提取值 - Python 3.x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58148110/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com