正则表达式模糊词匹配

时间:2014-12-16 00:29:02

标签: python regex parsing information-extraction

强硬的正则表达式问题:我想使用正则表达式从新闻句子中提取关于打击的信息。以下是一些例子:

doc1 = "5 young students arrested"
doc2 = "10 rebels were reported killed"

我希望根据实体和结果列表匹配句子:

entities = ['students','rebels']
outcomes = ['arrested','killed']

如何使用正则表达式从0-99999,任何实体,任何结果中提取参与者的数量,同时忽略随机文本(例如“年轻”或“被报告”)?这就是我所拥有的:

re.findall(r'\d{1,5} \D{1,50}'+ '|'.join(entities) + '\D{1,50}' + '|'.join(outcomes),doc1)

,即一个数字,一些可选的随机文本,一个实体,一些可选的随机文本和一个结果。 出现问题,我认为是因为OR语句。谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

这个正则表达式应该与你的两个例子相符:

pattern = r'\d+\s+.*?(' + '|'.join(entities) + r').*?(' + '|'.join(outcomes) + ')'

你遗漏的是围绕着OR的括号。

但是,仅使用正则表达式可能不会给您带来好结果。考虑使用像NLTK这样的自然语言处理库来解析句子。

答案 1 :(得分:0)

正如@ReutSharabani已经回答的那样,这不是一个正确的方法来做nlp,但这回答了字面上的问题。

正则表达式应为:

import re;
entities = ['students','rebels'];
outcomes = ['arrested','killed'];
p = re.compile(r'(\d{1,5})\D{1,50}('+'|'.join(entities)+')\D{1,50}('+'|'.join(outcomes)+')');
m = p.match(doc1);
number = m.group(1);
entity = m.group(2);
outcome = m.group(3);

您忘了将()分组为OR操作。相反,您生成的是a|b|\W|c|d|\W(简短版本)。

答案 2 :(得分:0)

您应该试用regex模块! 它内置了模糊匹配功能。其他答案看起来更加强大和圆滑,但这也可以通过模糊匹配来完成!

pattern = r'\d{1,5}(%(entities)s)(%(outcomes)s){i}' %{'entities' : '|'.join(entities), 'outcomes' : '|'.join(outcomes)}
regex.match(pattern, news_sentence)

这里发生的是{i}表示您希望匹配任意数量的插入。这里的问题是它可以将字符插入其中一个实体或结果中,但仍会产生匹配。如果您希望接受对任何结果或实体的拼写的轻微更改,那么您也可以使用{e< = 1}或其他内容。在提供的关于近似匹配的链接中阅读更多内容!