提取第一个单词+所有后续单词的第一个字符的正则表达式

问题描述 投票:1回答:2

我是(新手),使用R和正则正则表达式编写用于处理data.frame列中的字符串的正则表达式。我的数据在R中看起来像这样:

c1                       
Peter Parker            
Hawk & Dove             
J Jonah Jameson         
3JPX spo                
Bruce Wayne              

我想得到的是第二列“ c2”,它由以下字符串组成:

c2
PeterP
Hawk&D
JJJ
3JPXs
BruceW

基本上,我想要整个字符串的第一个单词(不考虑长度),之后是每个单词的第一个字母数字元素。我无法为此找到任何功能或逻辑。用正则表达式可以吗?

预先感谢

r regex
2个回答
5
投票

这里是使用gsub的基本R方法:

x <- c("Peter Parker", "Hawk & Dove", "J Jonah Jameson", "3JPX spo", "Bruce Wayne")
output <- gsub("\\s+(\\S)\\S*(?!\\S)", "\\1", x, perl=TRUE)
output

[1] "PeterP" "Hawk&D" "JJJ"    "3JPXs"  "BruceW"

正则表达式模式\s+(\S)\S*(?!\S)匹配一个或多个空格字符,然后匹配并捕获名称组件的第一个字符。它还消耗了名称部分的其余部分,仅替换为捕获的第一个字符。

如果上面的内容仍然不清楚,以下是正则表达式模式的工作原理,分步进行:

\s+    match one or more space characters
(\S)   then match AND capture the first character of the name-word
\S*    match the remainder of the name-word
(?!\S) assert that what follows the end of the name-word is either a space
       or the end of the string

gsub调用中的替换项只是\1,它是第一个也是唯一的捕获组,对应于每个名称的第一个字母,而不是第一个名字。


0
投票

尽管不是特别的正则表达式解决方案,但另一种方法可能是通过分隔每个单词来获取长格式的数据,按原样获取第一个单词,并从其余单词中仅获取第一个字符并将其粘贴。

library(dplyr)

df %>%
  group_by(row = row_number()) %>%
  tidyr::separate_rows(c1, sep = "\\s+") %>%
  summarise(c2 = paste0(first(c1) , paste0(substr(c1[-1], 1, 1), collapse = "")),
            c1 = paste(c1, collapse = " ")) %>%
  select(c1, c2, -row)

#   c1              c2    
#  <chr>           <chr> 
#1 Peter Parker    PeterP
#2 Hawk & Dove     Hawk&D
#3 J Jonah Jameson JJJ   
#4 3JPX spo        3JPXs 
#5 Bruce Wayne     BruceW

数据

df <- structure(list(c1 = c("Peter Parker", "Hawk & Dove", "J Jonah Jameson", 
"3JPX spo", "Bruce Wayne")), row.names = c(NA, -5L), class = "data.frame")
热门问题
推荐问题
最新问题