我是一名初学者,作为我的第一门编程语言,我已经学习了几个月的 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 个 |
),所以我在这里只选择其中的 1 个。所以我需要找到一个模式,例如:
'名词列表中的名词' + ', ' + '名词列表中的名词' + ', ' + 'CC_列表中的C' + ' ' + '名词列表中的名词
显然,上面引用的代码行不是真正的Python代码,而是我对所需匹配的想法的表达。我所说的noun in noun_list
是指对noun_list的迭代; CC_list 中的 C
是对 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.
最佳答案
把你的问题分解一下。首先,您需要一个与列表中的单词匹配的模式,但不能与其他单词匹配。您可以使用交替运算符 |
和文字来实现这一点。例如,red|green|blue
将匹配 "red"
、"green"
或 "blue"
>,但不是“紫色”
。使用该字符加入名词列表,并添加单词边界元字符和括号以对交替进行分组:
noun_patt = r'\b(' + '|'.join(nouns) + r')\b'
对连词列表执行相同的操作:
conj_patt = r'\b(' + '|'.join(conjunctions) + r')\b'
您想要进行的整体匹配是“一个或多个 noun_patt
匹配,每个匹配可选地后跟一个逗号,后跟一个 conj_patt
匹配,然后再匹配一个noun_patt
匹配”。对于正则表达式来说足够简单:
patt = r'({0},? )+{1} {0}'.format(noun_patt, conj_patt)
您并不是真的想使用 re.findall()
,而是使用 re.search()
,因为您只期望每行匹配一个:
for line in lines:
... print re.search(patt, line).group(0)
...
bacon, cheese and eggs
milk, cheese, and bacon
milk, cheese or eggs
milk, bacon, or eggs
请注意,就解析英语而言,即使没有触及正则表达式的极限,您也已经接近了。如果比这更复杂,您将需要研究实际的解析,也许使用 NLTK。
关于python - 从多个列表中的多个元素查找文本文件中的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18939934/