【问题标题】:Extract first letter in each word in R提取R中每个单词的第一个字母
【发布时间】:2018-08-31 17:11:46
【问题描述】:

我有一个带有一些分类变量的 data.frame。假设sentences 是这些变量之一:

sentences <- c("Direito à participação e ao controle social",
               "Direito a ser ouvido pelo governo e representantes", 
               "Direito aos serviços públicos",
               "Direito de acesso à informação")

对于每个值,我想只提取每个单词的第一个字母,忽略该单词是否有 4 个字母或更少(e、de、à、a、aos、ser、pelo),我的目标是创建首字母缩略词变量。我希望得到以下结果:

[1] "DPCS", "DOGR", "DSP", "DAI

我尝试使用 stringr 和创建的正则表达式模式 here 创建一个模式子集:

library(stringr)
pattern <- "^(\b[A-Z]\w*\s*)+$"
str_subset(str_to_upper(sentences), pattern)

但我在创建pattern 对象时出错:

Error: '\w'  is an escape sequence not recognized in the string beginning with ""^(\b[A-Z]\w"

我做错了什么?

提前感谢您的帮助。

【问题讨论】:

  • 样本字符向量的预期结果是什么?
  • 我编辑了问题以使其清楚
  • 你需要在 R 中使用双重转义。像 "\\b" 而不是 "\b"。
  • map_chr(str_extract_all(sentences,'\\b(\\w)(?=\\w{4,})'),paste,collapse="")?
  • @Aaron 修复了它。 Here you go

标签: r regex


【解决方案1】:

您可以使用gsub 删除所有不需要的字符并保留您想要的字符。从预期的输出来看,您似乎仍在使用 3 个字符长的单词中的字符:

 gsub('\\b(\\pL)\\pL{2,}|.','\\U\\1',sentences,perl = TRUE)
[1] "DPCS"   "DSOPGR" "DASP"   "DAI"  

但是,如果我们忽略您指出的字词,那就是:

gsub('\\b(\\pL)\\pL{4,}|.','\\U\\1',sentences,perl = TRUE)
[1] "DPCS" "DOGR" "DSP"  "DAI"  

【讨论】:

  • 你能解释一下你投反对票的原因吗?想改进
  • 答案对我来说似乎很好。也许有人只是不明白。
  • 好@Onyambu!非常感谢。它正是我需要的。请让我知道您是否有一些技巧可以使用管道在 tidyverse 语言中做同样的事情。
  • 是的,正如@emsimpson92 所说,改进将是对'\\b(\\pL)\\pL{2,}|.'模式的一点解释
【解决方案2】:

你可以使用这个模式:(?&lt;=^| )\S(?=\pL{4,})

我使用了积极的后向检查来确保匹配项前面有空格或行首。然后我匹配一个字符,前提是它后面跟着 4 个或更多字母,因此是正向前瞻。

我建议您不要将\w 用于非英语语言,因为它不会匹配任何带有重音符号的字符。相反,\pL 匹配来自任何语言的任何字母。

获得匹配项后,您可以将它们连接起来以创建您的字符串(dpcs、dogr 等...)

Here's a demo

【讨论】:

    【解决方案3】:

    @Onyambu 的回答很棒,虽然作为一个正则表达式初学者,我确实需要很长时间来尝试理解它,以便我可以根据自己的需要进行修改。

    这是我对gsub('\\b(\\pL)\\pL{4,}|.','\\U\\1',sentences,perl = TRUE)的理解。 希望对他人有所帮助。

    背景资料:

    • \\b: 词的边界
    • \\pL 匹配来自任何语言的任何类型的字母
    • {4,} 是一个发生指示器
      • {m}:前一项正好匹配m次。
      • {m,}:前一项匹配m次以上,即m+
      • {m,n}:前一项至少匹配m次,但不超过n次。
    • | 是 OR 逻辑运算符
    • . 代表除换行符以外的任意一个字符。

    \\U\\1 在替换文本中是重新插入模式捕获的文本以及大写文本。请注意,括号 () 在模式中创建一个编号的捕获组。

    有了所有的背景知识,命令的解释就是

    • 将匹配\\b(\\pL)\\pL{4,}的单词替换为第一个字母
    • "" 替换任何与上述模式不匹配的字符,因为该组没有捕获任何内容

    这是我学到所有这些背景的两个好地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      相关资源
      最近更新 更多