【问题标题】:Regular Expression to extract Named Entities from text just based on capitalization正则表达式仅基于大写从文本中提取命名实体
【发布时间】:2017-05-15 06:30:25
【问题描述】:

我想要一个 Python 中的正则表达式,它提取一个或多个以大写字母开头的单词,除非该单词出现在第一个单词中。我知道这不是一种稳健且一致的方法,但它会解决我的问题,因为我不想使用任何统计方法(例如,在 NLTK 或 StanfordNER 中)。

示例:

extract('His name is John Wayne.') 

应该返回 ['John Wayne']。

extract('He is The President of Neverland.')

应该返回 ['The President', 'Neverland'] 因为它们是大写的单词并且它们不会出现在句子的开头。

另一个例子:

extract('He came home. Although late, it was nice to have Patrick there.')

应该返回 ['Patrick'] 因为 'He' 和 'Although' 出现在句子的开头。

它还可以删除标点符号,例如“他是约翰,谁来了”应该返回“约翰”而不是“约翰”。

【问题讨论】:

  • 那么,你只需要Doe from John Doe arrived late?
  • 句子的定义是什么?
  • 句子分隔符是文本的开头或点+空格之后。
  • 这很好用。如果您将其作为答案(并且如果您可以解释不同部分的工作原理),我可以接受答案。谢谢。

标签: python regex regex-lookarounds


【解决方案1】:

您可以将此表达式用于此任务:

(?<!\.\s)(?!^)\b([A-Z]\w*(?:\s+[A-Z]\w*)*)

RegEx Demo

RegEx 拆分:

  • (?&lt;!\.\s) - 否定后向断言我们之前没有 DOT 和空格
  • (?!^) - 否定前瞻断言我们还没有开始
  • \b - 字边界
  • ( - 开始抓包
    • [A-Z]\w* - 匹配以大写字母开头的单词
    • (?: - 启动非捕获组
      • \s+ - 匹配 1 个或多个空格
      • [A-Z]\w* - 匹配大写字母单词
    • )* 结束非捕获组。匹配 0 个或多个这些
  • ) - 结束捕获组

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多