繁体   English   中英

如何用小写替换最后一个点之后的一些字符

[英]How to replace some characters after the last dot with their lower cases

一个简单的问题,但我无法解决。 我得到了一个像这个邮件地址这样的字符串:

ma <- "something@somewhere.COM"

我的目标是获得:

"something@somewhere.com"

所以把最后一个点之后的部分放在小写。 我读过thisthis ,所以我试过:

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"

如果您想将其应用于电子邮件地址的第二组,您可以使用具有 2 个捕获组的类似电子邮件的模式,并使用\\\\L作为第二组。

([^\s@]+@[^\s@]+\.)([^\s@]+)

例如

gsub("([^\\s@]+@[^\\s@]+\\.)([^\\s@]+)","\\1\\L\\2", "something@somewhere.COM", perl = T) 

输出

[1] "something@somewhere.com"

R 演示| 正则表达式演示

我们可以使用sub来捕获组并使用\\\\L将其更改为小写

sub("\\.(.*)$", ".\\L\\1", ma, perl = TRUE)
#[1] "something@somewhere.com"

电子邮件地址中 @ 之后的部分不区分大小写,因此您可以将 @ 之后的整个部分转换为小写,而不会出现任何问题。

我们考虑这两种情况。

将最后一个点后的所有内容转换为小写

要使用gsubfn确保正则表达式与扩展名匹配。

或者,我们可以使用工具包中的file_ext (工具包随 R 一起提供,因此无需安装)。

第三种方法是将file_path_sans_extfile_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM