regex - R - 使用正则表达式,在字符串中的第 n 个点之前设置位置并删除后面的内容

标签 regex r string gsub punctuation

我有一个包含一列字符串数据的大型数据框,该列当前包含一组名称,在某些情况下还包含一个电子邮件地址。我想找到一个正则表达式,它允许我在这些情况下使用电子邮件地址设置第二个逗号之前的位置,然后删除它后面的内容,以便我留下一个只有姓名的“作者”列,不包括电子邮件。

> author<-c("Doe, Jane", "Smith, John", "Doe, John, johndoe@xyz.net", "Smith, Jane")
> ID<- c(1:4)   
> df<-cbind(author, ID)

> df

  author                         ID 
[1,] Doe, Jane                   1
[2,] Smith, John                 2
[3,] Doe, John, johndoe@xyz.net  3
[4,] Smith, Jane                 4

我希望输出如下所示
>df

author                            ID 
[1,] Doe, Jane                    1
[2,] Smith, John                  2
[3,] Doe, John                    3
[4,] Smith, Jane                  4

最佳答案

使用 sub功能。 [^,]*匹配任何字符但不匹配 ,零次或多次。

> author<-c("Doe, Jane", "Smith, John", "Doe, John, johndoe@xyz.net", "Smith, Jane")
> sub("^([^,]*,[^,]*),.*", "\\1", author)
[1] "Doe, Jane"   "Smith, John" "Doe, John"   "Smith, Jane"
> ID<- c(1:4)
> df<-cbind(author=sub("^([^,]*,[^,]*),.*", "\\1", author), ID)
> df
     author        ID 
[1,] "Doe, Jane"   "1"
[2,] "Smith, John" "2"
[3,] "Doe, John"   "3"
[4,] "Smith, Jane" "4"

说明:
  • ^断言我们处于开始阶段。
  • ([^,]*,[^,]*) , (...)称为捕获组,用于捕获与该捕获组中存在的模式匹配的那些字符。在我们的例子中,捕获组中存在的模式是 [^,]*,[^,]* .我已经提到这个 [^,]*匹配任何字符但不匹配逗号,零次或多次。所以[^,]*,[^,]*匹配从开始到第二个逗号的所有字符。 ([^,]*,[^,]*)捕获那些匹配的字符并将其存储到组索引 1 中。我们可以通过指定它的索引号来引用存在于捕获组中的字符。这叫做反向引用 .
  • ,.*现在这匹配第二个逗号和以下零个或多个字符。
  • subgsub函数将用替换部分中提到的字符串替换所有匹配的字符。所以在我们的例子中,所有匹配的字符都被组索引 1 中的字符替换。这就是我们使用 \\1 的原因。在更换部分。
  • 关于regex - R - 使用正则表达式,在字符串中的第 n 个点之前设置位置并删除后面的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28281858/

    相关文章:

    javascript - 谁能告诉我这个对象的 "xauthtoken"的正则表达式?

    r - 如何在 R 中仅显示带标签的数据框中的一种类型的属性

    C 反转字符串不起作用

    python - 不要用 Python 字符串 split() 拆分双引号单词?

    java - 正则表达式模式仅匹配 Java 中逗号之间的两个字符

    php - 每当有 5 个空格时拆分字符串

    python - 如何在 python 中使用正则表达式从多行字符串中删除特定字符

    r - 相关矩阵 - tidyrgather v.reshape2melt

    r - 参数不是数字或逻辑 : returning NA

    c - 用文件 txt 中的单词填充字符串数组