如何使用R更改字符串中文本之前的值

Posted

技术标签:

【中文标题】如何使用R更改字符串中文本之前的值【英文标题】:How to change values before text in string using R 【发布时间】:2022-01-22 11:45:51 【问题描述】:

我有多个类似于以下模式的字符串:

dat<-("00000000AAAAAAAAAA0AAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAD0")

我需要将所有 0 值更改为“。”在字符串中的第一个字符值之前。在这个例子中我想要的输出是:

"........AAAAAAAAAAAA0AAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAD0".

我尝试使用 gsub 来完成这项任务:

gsub("\\G([^_\\d]*)\\d", ".\\1", dat, perl=T)

不幸的是,它把所有的 0 都改成了“.”。而不是第一个“A”之前的 0。

有人可以帮我解决这个问题吗?

【问题讨论】:

为什么不gsub("\\G0", ".", dat, perl=T)?看起来您只需要替换字符串中的初始零即可。或者你能再分享一些例子吗? 【参考方案1】:

如果您希望简单地将每个前导 0 替换为 .,您可以使用

gsub("\\G0", ".", dat, perl=TRUE)

这里,\G0 匹配字符串开头的 0 字符,然后每次匹配成功后。见this regex demo。

如果您需要替换字符串中的每个0 在您可以使用的第一个字母之前

gsub("\\G[^\\pL0]*\\K0", ".", dat, perl=TRUE)

这里,\G 匹配字符串的开头或前面成功匹配的结尾,[^\pL0]* 匹配除字母和0 之外的零个或多个字符,然后\K 省略匹配的文本,然后@987654335 @ 匹配 0 字符并替换为 .。见this regex demo。

见R demo online:

dat <- c("00000000AAAAAAAAAA0AAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAD0","102030405000AZD")
gsub("\\G0", ".", dat, perl=TRUE)
## [1] "........AAAAAAAAAA0AAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAD0"
## [2] "102030405000AZD"                                         
gsub("\\G[^\\pL0]*\\K0", ".", dat, perl=TRUE)
## [1] "........AAAAAAAAAA0AAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAD0"
## [2] "1.2.3.4.5...AZD"                                         

【讨论】:

【参考方案2】:

这真的很难。 所以我尝试使用自定义函数来做到这一点:

library(stringr)

dat<-("00000000AAAAAAAAAA0AAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAD0")

Zero_Replacer <- function(x) 
  x <- str_split(x, '[A-Za-z]', 2)
  x[[1]][1] <- str_replace_all(x[[1]][1], "0", ".")
  paste0(x[[1]][1], x[[1]][2])


Zero_Replacer(dat)

输出:

[1] "........AAAAAAAAA0AAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAD0"

【讨论】:

以上是关于如何使用R更改字符串中文本之前的值的主要内容,如果未能解决你的问题,请参考以下文章

每次分析结束时如何更改文本文件特定部分的值?

如何更改文本字段颤动中的值?

在js中,如何替换一个文本中的多个字符?

如何使用正则表达式更改具有特定值的字符串中的值?

更改一个文本字段的值也会无意中更改几个其他文本字段。我该如何防止这种情况?

如何onkeypress事件中得到一个输入文本框的文本