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}).
并且在第四个解决方案中有正则表达式的可视化:
^(.{7}).*
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"
我想删除变量的最后一个字符。
我想知道是否可以 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}).
并且在第四个解决方案中有正则表达式的可视化:
^(.{7}).*
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"