gpt4 book ai didi

r - 在更大的字符串中隔离字母字符串

转载 作者:行者123 更新时间:2023-12-04 05:36:41 25 4
gpt4 key购买 nike

有没有办法隔离按字母顺序排列的字符串部分?

换句话说,如果你有一个这样的字符串:hjubcdepyvb
你能按字母顺序拉出部分吗?:bcde
我想过使用is.unsorted()函数,但我不确定如何仅将其应用于字符串的一部分。

最佳答案

这是转换为 ASCII 并返回的一种方法:

input <- "hjubcdepyvb"
spl_asc <- as.integer(charToRaw(input)) # Convert to ASCII
d1 <- diff(spl_asc) == 1 # Find sequences
filt <- spl_asc[c(FALSE, d1) | c(d1, FALSE)] # Only keep sequences (incl start and end)
rawToChar(as.raw(filt)) # Convert back to character

#[1] "bcde"

请注意,这将连接按字母顺序排列的任何部分。

即如果输入是 "abcxasdicfgaqwe"那么输出将是 abcfg .

如果您想为每个连续字符串获得单独的向量,您可以执行以下操作
input <- "abcxasdicfgaqwe"
spl_asc <- as.integer(charToRaw(input))
d1 <- diff(spl_asc) == 1
r <- rle(c(FALSE, d1) | c(d1, FALSE)) # Find boundaries
cm <- cumsum(c(1, r$lengths)) # Map these to string positions
substring(input, cm[-length(cm)], cm[-1] - 1)[r$values] # Extract matching strings

最后,我不得不想出一种使用正则表达式的方法:
input <- c("abcxasdicfgaqwe", "xufasiuxaboqdasdij", "abcikmcapnoploDEFgnm",
"acfhgik")
(rg <- paste0("(", paste0(c(letters[-26], LETTERS[-26]),
"(?=", c(letters[-1], LETTERS[-1]), ")", collapse = "|"), ")+."))

#[1] "(a(?=b)|b(?=c)|c(?=d)|d(?=e)|e(?=f)|f(?=g)|g(?=h)|h(?=i)|i(?=j)|j(?=k)|
#k(?=l)|l(?=m)|m(?=n)|n(?=o)|o(?=p)|p(?=q)|q(?=r)|r(?=s)|s(?=t)|t(?=u)|u(?=v)|
#v(?=w)|w(?=x)|x(?=y)|y(?=z)|A(?=B)|B(?=C)|C(?=D)|D(?=E)|E(?=F)|F(?=G)|G(?=H)|
#H(?=I)|I(?=J)|J(?=K)|K(?=L)|L(?=M)|M(?=N)|N(?=O)|O(?=P)|P(?=Q)|Q(?=R)|R(?=S)|
#S(?=T)|T(?=U)|U(?=V)|V(?=W)|W(?=X)|X(?=Y)|Y(?=Z))+."

regmatches(input, gregexpr(rg, input, perl = TRUE))
#[[1]]
#[1] "abc" "fg"
#
#[[2]]
#[1] "ab" "ij"
#
#[[3]]
#[1] "abc" "nop" "DEF"
#
#[[4]]
#character(0)

此正则表达式将识别连续的大写或小写字母(但不能混合大小写)。正如演示的那样,它适用于字符向量并生成一个向量列表,其中包含所有已识别的匹配项。如果未找到匹配项,则输出为 character(0) .

关于r - 在更大的字符串中隔离字母字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42819975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com