提取在R中的另一个子字符串之后出现的字符串中的所有值

时间:2017-05-23 00:42:51

标签: r regex parsing substring

假设我有一个字符串:

fgjh=621729_&ioij_fgjh7=twenty-_-One-_-Forty

我想从此字符串中提取以下子字符串:

1. "621729"
2. "twenty"
3. "One"
4. "Forty"

基本上我想在“fgjh =”substring和“fgjh7 =”子字符串之后提取任何内容。

我发现这个公式适用于excel:

=TRIM(RIGHT(SUBSTITUTE(A1,"fgjh=",REPT(" ",LEN(A1))),LEN(A1)))

但是excel文件太大了,我需要在R

中执行相同的操作

我如何处理前导字符和尾随字符。让我们说字符串是“lmnop_82137_hhgia = 77789_pasdk_ikuk_fgjh = 621729_& ioij_fgjh7 = 20 - One - Forty_d saoij_882390 = lkuk”我需要在“fgjh =”之后提取数据,即621729以及“fgjh7 =”之后的所有内容只获得“二十”,“一”和“四十”

3 个答案:

答案 0 :(得分:0)

sub与正则表达式一起使用比按位置分割更灵活:

> sub(".*=(.*)_&.*", "\\1", "fgjh=621729_&ioij_fgjh7=twenty--One--Forty", )
[1] "621729"
> sub(".*=(.*)--.*--.*", "\\1", "fgjh=621729_&ioij_fgjh7=twenty--One--Forty", )
[1] "twenty"
> sub(".*--(.*)--.*", "\\1", "fgjh=621729_&ioij_fgjh7=twenty--One--Forty", )
[1] "One"
> sub(".*--(.*)$", "\\1", "fgjh=621729_&ioij_fgjh7=twenty--One--Forty", )
[1] "Forty"

在一行中:

strsplit(sub(".*=(.*)_&.*=(.*)--(.*)--(.*)", "\\1\\|\\2\\|\\3\\|\\4", 
  "fgjh=621729_&ioij_fgjh7=twenty--One--Forty" ), split="\\|")[[1]]

[1] "621729" "twenty" "One"    "Forty" 

答案 1 :(得分:0)

您可以使用包stringr和函数str_match来解析带有正则表达式的有趣位

> library(stringr)
> s <- "fgjh=621729_&ioij_fgjh7=twenty--One--Forty"

> str_match(s, "^fgjh=([0-9]+)_&ioij_fgjh7=(.+)--(.+)--(.+)$")
     [,1]                                         [,2]     [,3]     [,4]  [,5]   
[1,] "fgjh=621729_&ioij_fgjh7=twenty--One--Forty" "621729" "twenty" "One" "Forty"

答案 2 :(得分:0)

^[\.{1,40}|A{1}]+(?!A)+(B)+(?!B)+(B|\.{1,40})$