r语言 - 用于提取所有后续单词的第一个单词 + 第一个字符的正则表达式



我(新手(使用 R 和正则表达式编写用于操作data.frame列中的字符串的正则表达式。我的数据在 R 中如下所示:

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

我试图得到的是第二列"c2",它由以下字符串组成:

c2
PeterP
Hawk&D
JJJ
3JPXs
BruceW

基本上,我想要字符串的整个第一个单词(无论长度如何(和每个单词的第一个字母数字元素。我无法为此找到任何功能或逻辑。可以使用正则表达式这样做吗?

提前致谢

以下是使用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,这是第一个也是唯一一个捕获组,对应于每个名称的第一个字母,超出第一个名称。

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

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")

unglue的开发版本具有一个multiple参数,它可以是一个应用于同名匹配项的函数(这里我们想将它们与paste0()连接起来(。在我们的例子中,我们希望匹配完整的第一个单词,然后是用空格分隔的所有序列的第一个字符,并且在第一个单词之后有 1 个或 2 个这样的序列:

# remotes::install_github("moodymudskipper/unglue")
library(unglue)
patterns <- c(
"{c2} {c2=\S}{=\S*} {c2=\S}{=\S*}",
"{c2} {c2=\S}{=\S*}")
unglue_data(df$c1, patterns, multiple = paste0)
#>       c2
#> 1 PeterP
#> 2 Hawk&D
#> 3    JJJ
#> 4  3JPXs
#> 5 BruceW  

最新更新