如何使用正则表达式缩写名称?

时间:2017-01-20 11:57:42

标签: r regex

我想知道是否有可能做这个缩写?

t <- "CERVANTES CASA,JORGE LUIS"

期望的结果是:

CERVANTES, JL

方法:

> sub("\\s.+,", ", ", t)
[1] "CERVANTES, JORGE LUIS"

我的问题是,由于我有很长的名单,如何让替换返回最后两个名字的第一个字母?考虑到字符从一个字符串到另一个字符串是不同的。例: 对于“JORGE”,J;对于LUIS,“L”。

2 个答案:

答案 0 :(得分:3)

使用

> library(stringr)
> t <- "CERVANTES CASA,JORGE ANTONIO"
> str_replace_all(t, "\\s[^,]*,\\s*(\\p{L})\\p{L}*(?:\\s+(\\p{L})\\p{L}*)?$", ", \\1\\2")
[1] "CERVANTES, JA"

请参阅pattern online demo

正则表达式匹配

  • \\s - 一个空格,然后
  • [^,]* - 除,以外的0 +字符,然后
  • , - 逗号,
  • \\s* - 再次0+空格,
  • (\\p{L}) - 捕获一封信然后
  • \\p{L}* - 匹配单词的其余部分,然后
  • (?:\\s+(\\p{L})\\p{L}*)? - 匹配以下可选序列:
    • \\s+ - 1+空格,
    • (\\p{L}) - 另一封信(被捕获到第2组)然后
    • \\p{L}* - 直到字符串末尾的0+个字母。我不确定这是OP需要的。
  • $ - 字符串结尾

替换模式:

  • , - 逗号和空格
  • \\1\\2 - 对第1组和第2组的两个反向引用,插入与2组匹配的内容。

答案 1 :(得分:1)

您可以按照以下步骤在数据框中获取所需的缩写:

第一:数据样本:

Name<- as.data.frame(("CERVANTES CASA,JORGE ANTONIO"))
colnames(Name)<-"Name"

第二:将名称分为两列(逗号是分隔符):

df2<-as.data.frame(str_split_fixed(Name$Name, ",", 2))
colnames(df2)<-c("Last_Name", "Name")

第三:提取姓氏的第一个字:

df2$First_LastName <- gsub("([A-Za-z]+).*", "\\1", df2$Last_Name)

第四:从姓名中提取第一个字母:

df2$First_Letter_Name<- substr(df2$Name, 1, 1)

在一栏中加入所需的单词:

df2$desired <- paste(df2$First_Last_Name,",",df2$First_Letter_Name )
output in new column: CERVANTES , J