强硬的正则表达式问题:我想使用正则表达式从新闻句子中提取关于打击的信息。以下是一些例子:
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语句。谢谢你的帮助!
答案 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}或其他内容。在提供的关于近似匹配的链接中阅读更多内容!