R 查找字符串中分隔两个子字符串的字符数

R 查找字符串中分隔两个子字符串的字符数,r,R,我有一个数据帧,df,看起来像: string substring abcxxxxxZxxabc abc defxdefxZxdefx def 我想要一个距离栏: string substring distances abcxxxxxZxxabc abc 5, 2 defxdefxZxdefx def 5, 1, 1

我有一个数据帧,
df
,看起来像:

string            substring        
abcxxxxxZxxabc    abc               
defxdefxZxdefx    def               
我想要一个距离栏:

string            substring   distances
abcxxxxxZxxabc    abc         5, 2
defxdefxZxdefx    def         5, 1, 1
我主要想做的是找到
df$substring
中的字符串和
df$string
中的“Z”之间的“距离”(中间的字符数)

距离的顺序并不重要,如果重要的话,
df$string
中的所有内容都是相同的长度,“Z”始终位于相同的位置。

我们可以使用

library(dplyr)
library(stringr)
library(purrr)
df1 %>%
 mutate(new = map2(str_extract_all(string,
     sprintf('(?<=%s).*(?=Z)|(?<=Z).*(?=%s)', substring, substring)),
      substring, ~{
        n <- nchar(.x)
        i1 <- str_detect(.x, .y)
        c(n, nchar(str_remove(.x[i1], str_c(".*", .y))))
        
       })) 
库(dplyr)
图书馆(stringr)
图书馆(purrr)
df1%>%
mutate(new=map2(str_extract_all)(字符串,
sprintf(')(?我们可以使用

library(dplyr)
library(stringr)
library(purrr)
df1 %>%
 mutate(new = map2(str_extract_all(string,
     sprintf('(?<=%s).*(?=Z)|(?<=Z).*(?=%s)', substring, substring)),
      substring, ~{
        n <- nchar(.x)
        i1 <- str_detect(.x, .y)
        c(n, nchar(str_remove(.x[i1], str_c(".*", .y))))
        
       })) 
库(dplyr)
图书馆(stringr)
图书馆(purrr)
df1%>%
mutate(new=map2(str_extract_all)(字符串,

sprintf('(?这里是一个基本的R选项

transform(
  df,
  distance =
    mapply(
      function(x, y) {
        u <- gregexpr(y, x)[[1]] - gregexpr("Z", x)[[1]]
        toString(ifelse(u < 0, -(u + nchar(y)), u - 1))
      },
      string,
      substring,
      USE.NAMES = FALSE
    )
)

这是一个基本的R选项

transform(
  df,
  distance =
    mapply(
      function(x, y) {
        u <- gregexpr(y, x)[[1]] - gregexpr("Z", x)[[1]]
        toString(ifelse(u < 0, -(u + nchar(y)), u - 1))
      },
      string,
      substring,
      USE.NAMES = FALSE
    )
)

这似乎找到了“距离”例如,将第二行中的字符串更改为
defxdefxZxxdefx
应该返回
5,1,2
,但它返回
5,2
。有什么办法解决这个问题吗?@initialruser19对于该stirng,“def”之间的字符数'和'Z'是5,Z和def是2,最后一种情况是
defx
结尾没有任何'Z',这可能是误解,但是
defx
结尾有一个'Z'。子字符串是
defxZ
,应该给出一个“距离”有没有办法解释这个问题?@初学者Ruser19您的字符串是
defxdefxZxdefx
在end@beginnerRuser19根据当前代码,我得到了sceondIt的
5,1
,似乎这样可以找到“距离”例如,将第二行中的字符串更改为
defxdefxZxxdefx
应该返回
5,1,2
,但它返回
5,2
。有什么办法解决这个问题吗?@initialruser19对于该stirng,“def”之间的字符数'和'Z'是5,Z和def是2,最后一种情况是
defx
结尾没有任何'Z',这可能是误解,但是
defx
结尾有一个'Z'。子字符串是
defxZ
,应该给出一个“距离”有没有办法解释这个问题?@初学者Ruser19您的字符串是
defxdefxZxdefx
在end@beginnerRuser19使用当前代码,我得到第二个代码的
5,1