【问题标题】:Unable to extract Name from text in R无法从 R 中的文本中提取名称
【发布时间】:2019-05-30 19:40:53
【问题描述】:

我正在尝试找出使用什么正则表达式从文本中提取名称。每个名字都有一个首字母、一个句号和姓氏,后面跟着一个似乎是空格 () 的代码,当我将 csv 上传到 R 时,出于某种原因,它出现了。

以下是文本布局的四个示例:

D. Nowitzki<U+00A0>misses 2-pt jump shot from 17 ft
J. Calderon<U+00A0>misses 2-pt jump shot from 12 ft
Turnover by<U+00A0>M. Ellis<U+00A0>(bad pass; steal by<U+00A0>T. 
Splitter)

S 的防守篮板。马里昂

    data$Player <- sub("(.*\\..*)<", "\\1", data$Play)

    data$Player <- sub("(.*\\..*)<", "\\1", data$Play)

【问题讨论】:

  • 试试stringr::str_extract(data$Play, "\\b\\p{Lu}\\.\\s*\\w+")
  • 哇。快速。非常感谢。为了我的学习,你能解释一下我哪里出错了,正则表达式中的 {Lu} 是什么?

标签: r regex stringr


【解决方案1】:

您的模式 (.*\..*)&lt; 将尽可能多的任何 0+ 字符捕获到第 1 组,然后是 . 字符,然后尽可能多地捕获任何 0+ 字符,然后匹配 &lt;。因此,您匹配了很多文本,不清楚 &lt;U+00A0&gt; 是文字文本还是代表数据中不间断空格的实体。如果后者为真,则您的模式不匹配,因为没有 &lt;

我假设您想提取第一个以字母开头的匹配项作为一个完整的单词,然后是一个点,然后是任何 0 个或多个空格,然后是 1+ 个字母。因此,您可以使用

\b\p{Lu}\.\s*\p{L}+

请参阅regex demo

详情

  • \b - 单词边界
  • \p{Lu} - 任何大写的 Unicode 字母 -\. - 一个点
  • \s* - 0+ 个空格
  • \p{L}+ - 任意 1+ Unicode 字母

在 R 中,您可以轻松地使用带有 stringr::str_extract 的模式,它只提取第一个匹配项:

res <- stringr::str_extract(data$Play, "\\b\\p{Lu}\\.\\s*\\p{L}+")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多