R - gsub 特定位置的特定字符

R - gsub a specific character of a specific position

我想删除变量的最后一个字符。 我想知道是否可以 select 使用 gsub 的位置并删除该特定位置的字符。

在这个例子中,我想删除最后一个数字,在 E 之后,用于我的 4 个变量。

variables = c('B10243E1', 'B10243E2', 'B10243E3', 'B10243E4')
gsub(pattern = '[[:xdigit:]]{8}.', replacement = '', x = variables)

我想我们可以使用命令

{}

为了select特定位置。

如果您总是想删除 E 之后的内容,您可以捕获它之后的所有内容并替换为 E

sub("E(.*)", 'E', variables)
## [1] "B10243E" "B10243E" "B10243E" "B10243E"

或者,您可以使用 positive look behind 计数 7 个字符,然后删除所有字符

sub("(?<=.{7})(.)", "", variables, perl = TRUE)
## [1] "B10243E" "B10243E" "B10243E" "B10243E"

您可以通过捕获除最后一个以外的所有字符来实现:

variables = c('B10243E1', 'B10243E2', 'B10243E3', 'B10243E4')
gsub('^(.*).$', '\1', variables)

解释:

  • ^ - 字符串的开头
  • (.*) - 除换行符外的所有字符,最多
  • .$ - 字符串结尾 ($) 之前的最后一个字符(用 . 捕获)。

因此,如果您打算删除 final 字符,并且字符串不包含换行符,则可以使用此正则表达式。

demo

输出:

[1] "B10243E" "B10243E" "B10243E" "B10243E"  

只替换第 8 个字符(这里是我在每个项目末尾添加 T 的示例):

variables = c('B10247E1T', 'B10243E2T', 'B10243E3T', 'B10243E4T')
gsub('^(.{7}).', '\1', variables)

sample program的输出(不是每一项末尾的ET,数字被删除):

[1] "B10247ET" "B10243ET" "B10243ET" "B10243ET" 

试试这些。第一个删除最后一个字符,第二个用 E 替换 E 和它后面的任何内容,第三个 returns 前 7 个字符假设有 8 个字符,其余每个 return 前 7 个字符。所有都是向量化的,即 variables 可能是问题中的字符串向量。

sub(".$", "", variables)

sub("E.*", "E", variables)

sub("^(.{7}).", "\1", variables)

sub("^(.{7}).*", "\1", variables)

substr(variables, 1, 7)

substring(variables, 1, 7)

trimws("abc333", "right", "\d") # requires R 3.6 (currently r-devel)

这是第三个解决方案中正则表达式的可视化:

^(.{7}).

Debuggex Demo

并且在第四个解决方案中有正则表达式的可视化:

^(.{7}).*

Debuggex Demo

library(stringr)
str_sub("your String", 1, -2)

可能比其他的慢,但更容易阅读。

您还可以使用 stringr 包中的 str_sub

library(stringr)
variables = c('B10243E1', 'B10243E2', 'B10243E3', 'B10243E4')
variables = str_sub (variables, start = 1, end = -2)

输出:

> variables
[1] "B10243E" "B10243E" "B10243E" "B10243E"