在几种模式之前删除元素

我有关于国家的数据,例如

MWE <- list("Argentina -2.4 3.4","Euro area 3.7 6.4")

我想获取仅包含数字的列表。在我的示例中,得到"-2.4 3.4" "3.7 6.4"。请注意,我的“国家/地区”可以用几个词来表示,因此我无法像想要的那样轻松地玩空格游戏。

我设法只用正数,用

MWE_1 <- sub("^.*?(\\d)","\\1",MWE)

但是对于负数,或者在数字之前也可以使用其他词,我的方法无效。

我尝试使用|,但都失败了

MWE_2 <- sub("^.*?(\\d)|^.*?(-)",MWE)
MWE_3 <- sub("^.*?(\\d|-)",MWE)

在不减去“ 2.4 3.4”“ 3.7 6.4”的情况下也得到了相同的结果。

如果我的MWE是

MWE <- list("R text1 47 GDP -2.4 3.4","Euro area but not UK CPI 3.7 6.4")

我想从“ GDP”或“ CPI”中获取所有文本,即GDP 2.4 3.4CPI 3.7 6.4。碰巧

nmWE2 <- sub("^.*?(GDP|CPI)",nmWE)

可以工作,所以我想这只是如何指定减号的问题,尽管用\\-进行转义也不起作用。 `

ancen1978 回答:在几种模式之前删除元素

这里有一些替代方法。全部仅使用基数R。

1)在第一个数字字段附近插入逗号在第一个数字前后插入逗号(替换空格),然后使用read.table

read.table(text = sub(" ([-0-9.]+) ",",\\1,unlist(MWE)),sep = ",as.is = TRUE)

给予:

         V1   V2  V3
1 Argentina -2.4 3.4
2 Euro area  3.7 6.4

2)重复的子:用逗号替换最后一个空格两次。

mwe <- sub("(.*) ","\\1,sub("(.*) ",unlist(MWE)))
read.table(text = mwe,as.is = TRUE)

3)捕获 strcapture采用一种模式并将每个捕获组放在一列中:

strcapture("(.*) (.*) (.*)",unlist(MWE),list(V1 = character(0),V2 = numeric(0),V3 = numeric(0)))
,

您要使用PCRE正则表达式(请注意,将perl=TRUE(g)sub一起使用):

^(?:.*\b(GDP|CPI)\b|.*?([+-]?\d))

请参见regex demo

详细信息

  • ^-字符串的开头
  • (?:.*\b(GDP|CPI)\b|.*?([+-]?\d))-与两个选项之一匹配的非捕获组:
    • .*\b(GDP|CPI)\b-除换行符以外的任何零个或多个字符,应尽可能多,直到字符串的最后一个完整单词GDPCPI(捕获到组1,{ {1}})
    • \1-或
    • |-除换行符外,任何零个或多个字符应尽可能少,直到第一个可选的.*?([+-]?\d)-,然后是1位数字(捕获到组2中) +

R demo

\2
,

另一种可能性:

gsub(".*? ([^ ]+ .[^ ]+)","\\1",MWE)
#> [1] "-2.4 3.4" "3.7 6.4" 

我们匹配以下序列:

  • 任何内容(可能包含空格)
  • 一个空格
  • 一些非空格字符
  • 另一个空间
  • 更多非空格字符

将其替换为由后者3组成的组。


edit:阅读完另一个问题R remove elements based on several options后,您似乎想提取所有信息,在这种情况下,您可能会喜欢我的unglue包裹。

# install.packages("unglue")
library(unglue)
MWE <- list("Argentina -2.4 3.4","Euro area 3.7 6.4")

unglue_data(MWE,"{Country} {numbers=[^ ]+ [^ ]+}")
#>     Country  numbers
#> 1 Argentina -2.4 3.4
#> 2 Euro area  3.7 6.4

unglue_data(MWE,"{Country} {number1=[^ ]+} {number2=[^ ]+}",convert = TRUE)
#>     Country number1 number2
#> 1 Argentina    -2.4     3.4
#> 2 Euro area     3.7     6.4

reprex package(v0.3.0)于2019-11-06创建

此处有更多相关信息:https://github.com/moodymudskipper/unglue/blob/master/README.md

,

如果您的格式始终以两个实数结尾,那么也许可以执行以下操作:

gsub(".*?\\s(\\-?\\d+.*)",MWE)

匹配和提取从实数(或第一个数字的符号)开始

本文链接:https://www.f2er.com/3158234.html

大家都在问