![](/img/trans.png)
[英]How do I replace a vector of words with different cases, with the lower case characters only?
[英]How to replace some characters after the last dot with their lower cases
一个简单的问题,但我无法解决。 我得到了一个像这个邮件地址这样的字符串:
ma <- "something@somewhere.COM"
我的目标是获得:
"something@somewhere.com"
所以把最后一个点之后的部分放在小写。 我读过this , this ,所以我试过:
gsub(".*\\.","\\L\\1", ma, perl = T)
[1] "COM" # nope
还有类似的东西:
library(gsubfn)
options(gsubfn.engine = "R")
gsubfn(".*\\.", ~ tolower(x), ma)
[1] "something@somewhere.COM" # nope
我很困惑,因为我似乎可以获取我想要替换的部分:
gsub(".*\\.","", ma)
[1] "COM"
但我无法正确更换它。 如果您能给出解决方案的解释,我将不胜感激,正则表达式不是我最强大的功能。
\\\\L
& \\\\U
适用于捕获组- 您的第一次尝试很接近,但没有说明将命令应用于哪个组:
ma <-"something@somewhere.COM"
gsub('(.*\\.)(.*)$', '\\1\\L\\2', ma, perl = TRUE)
# [1] "something@somewhere.com"
请注意,我们捕获了两个组 -之前(并包括) .
,我们不理会; 和之后的部分.
,我们移到小写。
另请注意,使用此正则表达式来防止.
:
gsub('(.*\\.)([^.]*)$', '\\1\\L\\2', ma, perl = TRUE)
# [1] "something@somewhere.com"
我们可以使用sub
来捕获组并使用\\\\L
将其更改为小写
sub("\\.(.*)$", ".\\L\\1", ma, perl = TRUE)
#[1] "something@somewhere.com"
电子邮件地址中 @ 之后的部分不区分大小写,因此您可以将 @ 之后的整个部分转换为小写,而不会出现任何问题。
我们考虑这两种情况。
要使用gsubfn
确保正则表达式与扩展名匹配。
或者,我们可以使用工具包中的file_ext
(工具包随 R 一起提供,因此无需安装)。
第三种方法是将file_path_sans_ext
和file_ext
(都来自工具)一起使用,并在没有扩展名的情况下删除任何尾随点。 如果我们知道总有一个扩展,那么sub
部分可以省略。
(当然,如果我们知道扩展名之前的部分没有大写字符,或者如果我们不介意将其转换为小写,我们可以将tolower
应用于整个输入。)
s <- "something@somewhere.COM"
# 1
library(gsubfn)
gsubfn("\\.[^.]*$", tolower, s)
## [1] "something@somewhere.com"
# 2
library(tools)
ext <- file_ext(s)
sub(paste0(ext, "$"), tolower(ext), s)
## [1] "something@somewhere.com"
# 3
library(tools)
sub("\\.$", "", paste(file_path_sans_ext(s), tolower(file_ext(s)), sep = "."))
## [1] "something@somewhere.com"
如前所述,域,即@字符之后的字符串部分不区分大小写,因此我们可以将整个部分转换为小写。 这是一个更简单的问题,因为我们保证只有一个 @ 实例。 我们在(4)中使用gsubfn
在(5)中提取@前后的部分,并在(6)中使用没有任何正则表达式的read.table
。
s <- "something@somewhere.COM"
# 4
library(gsubfn)
gsubfn("@.*", tolower, s)
## [1] "something@somewhere.com"
# 5
paste(sub("@.*", "", s), tolower(sub(".*@", "", s)), sep = "@")
## [1] "something@somewhere.com"
# 6
with(read.table(text = s, sep = "@", as.is = TRUE), paste(V1, tolower(V2), sep = "@"))
## [1] "something@somewhere.com"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.