【发布时间】:2013-09-27 05:01:11
【问题描述】:
我是一个初学者,几个月来一直在学习 Python 作为我的第一门编程语言。我正在寻找从文本文件中查找模式。我的第一次尝试是使用正则表达式,它确实有效但有一个限制:
import re
noun_list = ['bacon', 'cheese', 'eggs', 'milk', 'list', 'dog']
CC_list = ['and', 'or']
noun_list_pattern1 = r'\b\w+\b,\s\b\w+\b,\sand\s\b\w+\b|\b\w+\b,\s\b\w+\b,\sor\s\b\w+\b|\b\w+\b,\s\b\w+\b\sand\s\b\w+\b|\b\w+\b,\s\b\w+\b,\saor\s\b\w+\b'
with open('test_sentence.txt', 'r') as input_f:
read_input = input_f.read()
word = re.findall(noun_list_pattern1, read_input)
for w in word:
print w
else:
pass
所以此时您可能会问,为什么在这段代码中的列表没有被使用。好吧,我一直在绞尽脑汁,尝试各种 for 循环和函数中的 if 语句,试图找出复制正则表达式模式的原因,但使用列表。
正则表达式的局限性在于,在 `noun_list_pattern' 中多次找到的 \b\w+\w\ 代码实际上只能找到单词 - 任何单词 - 而不是特定名词。这可能会引发误报。我想通过使用上面列表中的元素而不是正则表达式来进一步缩小范围。
因为我在正则表达式模式中实际上有 4 个不同的正则表达式(它包含 4 个|),所以我将只选择其中的一个。所以我需要找到一个模式,比如:
'noun in noun_list' + ', ' + 'noun in noun_list' + ', ' + 'C in CC_list' + ' ' + 'noun in noun_list
显然,上面引用的代码行不是真正的python代码,而是我对所需匹配的想法的表达。我说noun in noun_list 的意思是通过名词列表的迭代; C in CC_list 是通过 CC_list 的迭代; , 是逗号和空格的文字字符串匹配。
希望我已经说清楚了!
这是我正在使用的test_sentence.txt 文件的内容:
I need to buy are bacon, cheese and eggs.
I also need to buy milk, cheese, and bacon.
What's your favorite: milk, cheese or eggs.
What's my favorite: milk, bacon, or eggs.
【问题讨论】:
-
你能发一个你想匹配的数据的例子吗?
-
哎呀!是的,会的,忘记了。
-
您是否尝试分析每个句子的结构并将相似的内容归为一类?如果是,您可能想尝试 nltk 库:nltk.org 他们还有一个写得很好的免费文档(作为一本书提供)作为初学者指南。
-
@Mai 我确实花了一些时间在 nltk;但是,我发现它们并不完美,也不能正确地将名词标记为名词。所以,我决定使用我自己的名词列表。不过,nltk 发生的事情真是太神奇了。