在python中导航文本文件搜索

2024-06-01 10:48:04 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我正在处理的文本文件示例:

<Opera>

Tristan/NNP
and/CC
Isolde/NNP
and/CC
the/DT
fatalistic/NN
horns/VBZ
The/DT
passionate/JJ
violins/NN
And/CC
ominous/JJ
clarinet/NN
;/:

前斜杠后的大写字母是奇怪的标记。我想能够搜索文件中类似^{cd1>}的内容,并让程序返回这个段^{cd2>},这是一行中与这三个标记匹配的三个单词。

我的问题是我希望搜索字符串被用户输入,这样它将永远是不同的。
我可以读取文件并找到一个匹配项,但我不知道如何从那个点向后计数来打印第一个单词,或者如何找到下一个标记是否匹配。


Tags: and文件the标记示例dtnnopera
3条回答
>>> import re 
>>> s = "Tristan/NNP and/CC Isolde/NNP and/CC the/DT fatalistic/NN horns/VBZ The/DT passionate/JJ violins/NN And/CC ominous/JJ clarinet/NN ;/:"
>>> re.findall("(\w+)/NNP (\w+)/CC (\w+)/NNP", s)
[('Tristan', 'and', 'Isolde')]

同样,你可以做你需要的。在

编辑:更一般化。在

^{pr2}$

您的源文本可能是由Natural Language Toolkit (nltk)生成的。在

使用nltk,您可以标记文本,将标记拆分为(word,part_-speech)元组,并迭代ngram以找到与模式匹配的那些:

import nltk
pattern = 'NNP,CC,NNP'
pattern = [pat.strip() for pat in pattern.split(',')]
text = '''Tristan/NNP and/CC Isolde/NNP and/CC the/DT fatalistic/NN horns/VBZ
          The/DT passionate/JJ violins/NN And/CC ominous/JJ clarinet/NN ;/:'''
tagged_token = [nltk.tag.str2tuple(word) for word in nltk.word_tokenize(text)]
for ngram in nltk.ingrams(tagged_token,len(pattern)):
    if all(gram[1] == pat for gram,pat in zip(ngram,pattern)):
        print(' '.join(word for word, pos in ngram))      

收益率

^{pr2}$

相关链接:

从要搜索的标记列表动态生成正则表达式:

text = ("Tristan/NNP and/CC Isolde/NNP and/CC the/DT fatalistic/NN horns/VBZ "
    "The/DT passionate/JJ violins/NN And/CC ominous/JJ clarinet/NN")

tags = ["NNP", "CC", "NNP"]
tags_pattern = r"\b" + r"\s+".join(r"(\w+)/{0}".format(tag) for tag in tags) + r"\b"
# gives you r"\b(\w+)/NNP\s+(\w+)/CC\s+(\w+)/NNP\b"

from re import findall
print(findall(tags_pattern, text))

相关问题 更多 >