R根据几个选项删除元素

时间:2019-11-05 17:18:16

标签: r regex

我在列表中有数据,例如

MWE <- list("Argentina -2.0 1.4", "G20 6.9 0.7", "United Kingdom 1.3 2.3", "EU28 6.6 2.8")

所需的输出:

[1] "Argentina"    "G20"           "United Kingdom" "EU28"        

那是我的大多数标识符只是文字,但有些标识符具有数字(G7,G20,EA15等),但有一个有限列表。

我尝试在gsub上使用OR条件,但到目前为止失败了。例如,

> MWE_1 <- gsub("[^([:alpha:]|G20|EU28)]", "",MWE)
> MWE_1
[1] "Argentina20"    "G200"           "UnitedKingdom2" "EU2828"   

似乎我还没有找到正确使用or条件的方法 理想情况下,它会根据字符之间(例如英国)之间(例如-2,0 1,4)之间的空格来分隔空格,但我对UnitedKingdom表示满意

4 个答案:

答案 0 :(得分:2)

您可以使用第一个捕获组并匹配其余的行。

在替换中,使用第一个捕获组。

^([A-Za-z]+(?: [A-Za-z]+)*|G20|EU28)\b.*$
  • ^字符串的开头
  • (捕获第1组
    • [A-Za-z]+匹配1+ A-Za-z
    • (?: [A-Za-z]+)*重复0+次匹配一个空格和1+次a-zA-Z
    • |
    • G20字面上匹配
    • |
    • EU28字面上匹配
  • )\b紧随其后的是单词边界
  • .*匹配除换行符0次以上以外的所有字符
  • $字符串结尾

Regex demo | R demo

例如

MWE <- list("Argentina -2.0 1.4", "G20 6.9 0.7", "United Kingdom 1.3 2.3", "EU28 6.6 2.8")
MWE_1 <- gsub("^([A-Za-z]+(?: [A-Za-z]+)*|G20|EU28)\\b.*$", "\\1",MWE)
MWE_1

输出

[1] "Argentina"      "G20"            "United Kingdom" "EU28"

使用:[[:alpha:]]代码行看起来像

MWE_1 <- gsub("^([[:alpha:]]+(?: [[:alpha:]]+)*|G20|EU28)\\b.*$", "\\1",MWE)

答案 1 :(得分:1)

此模式会删除空格,后跟空格或可能带有小数的正数或负数:

gsub("\\s+\\-?\\d+\\.?\\d*", "", MWE)
[1] "Argentina"      "G20"            "United Kingdom" "EU28" 

这将返回字符串中的所有内容,直至空格,后跟一个数字(正数或负数):

gsub("(.*?)\\s+\\-*\\d+.*", "\\1", MWE)
[1] "Argentina"      "G20"            "United Kingdom" "EU28"

答案 2 :(得分:1)

我的变体:

MWE <- list("Argentina -2.0 1.4", "G20 6.9 0.7", "United Kingdom 1.3 2.3", "EU28 6.6 2.8")

gsub("\\s+", "", gsub("[0-9\\-]+\\.+[0-9]+", "", MWE))
# [1] "Argentina"     "G20"           "UnitedKingdom" "EU28"

在这里,内部gsub()查找以下模式:

  • 包含一个或多个-或数字
  • 之后是一个或多个.
  • 后跟一位或多位数字

并删除匹配的模式(即,将其替换为"")。

外部gsub()然后从该结果中去除所有空格。

优点:您正在呼叫gsub()

缺点:您打了两次gsub()

答案 3 :(得分:0)

您可以尝试使用gsub("\\s\\-?\\d+.*","",MWE),例如

> gsub("\\s\\-?\\d+.*","",MWE)
[1] "Argentina"      "G20"            "United Kingdom" "EU28"